end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

jQuery.ajax()でファイルのダウンロード

javascript (ajax)では、ファイル保存ダイアログを起動できない?

ブラウザでファイルをダウンロードすると、通常、次のようなコモン?ダイアログが表示されますが、javascript (ajax)で、このダイアログを起動することはできないようです。

ajaxのダウンロードは、validation後、location.hrefでredirect

どうやら、ajaxを使ったファイルのダウンロードは、サーバによるvalidation後、実際?のダウンロード用URLへリダイレクトすることで、ファイル保存ダイアログを起動できるみたい。


client側、server側のsrcは、以下に貼っておきます。

client側 html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="bootstrap/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="ajax_download.js"></script>
</head>

<body>
<div class="container">
<h1>legacy download</h1>
<a href="dl-test.xls">dl-test.xls</a><br>

<h1>ajax download</h1>
<input type="button" value="GET dl-test.xls"
  onClick="ajax_download('success')">

<input type="button" value="GET dl-test.xls FAIL"
  onClick="ajax_download('fail')">

<input type="button" value="GET dl-test.xls DIE"
  onClick="ajax_download('die')">

</div><!--.container-->
</body>
</html>
client側 javascript
function ajax_download(ac_type){
    $.ajax({
        type: "GET",
        async: true,
        cache: false,
        url: "ajax_server.pl",
        data: {ac:ac_type},
        success: function(data, text_status, xhr){
            var res = eval('('+data+')');
            if (res.err_msg != undefined ){
                alert( res.err_msg );
                return;
            }
            location.href = res.redirect_url;
        },
        error: function(xhr, text_status, err_thrown){
            alert(err_thrown + ' ファイルダウンロードに失敗しました');
        }
    });
}
server側 perl script
#!/usr/local/bin/perl
use strict;
use utf8;
use CGI;
use Encode;
use JSON;

my $REDIRECT_URL = 'dl-test.xls';

main();

sub main {
    my $q = CGI->new();
    #### DIE
    die	if ($q->param('ac') eq 'die' );

    #### FAIL
    if ($q->param('ac') eq 'fail' ){
	my $res = {err_msg=>'〜さんにはダウンロード権限がありません'};
	print CGI::header(-type=>'text/plain',-charset=>'UTF-8');
	print encode('utf8',JSON::to_json($res));
	return 1;
    }

    #### SUCCESS
    my $res = {redirect_url=>$REDIRECT_URL};
    print CGI::header(-type=>'text/plain',-charset=>'UTF-8');
    print encode('utf8',JSON::to_json($res));
    return 1;
}
1;
__END__