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__