サーバーに iframe で送信する JavaScript でこの関数を作成しました。
function download(url, datas){
if(url && datas){
var inputs = '', value,
iframe = '<iframe name="iframeDownload" id="iframeDownload" width=0 height=0></iframe>';
$(iframe).appendTo('body');
datas.forEach(function(data){
name = encodeURI(data.get('name'));
value = encodeURI(data.get('value'));
inputs+='<input name="'+name+'" value="'+value+'"/>';
});
$('<form action="'+url+'" method="post" target="iframeDownload">'+inputs+'</form>').appendTo('body').submit().remove(); // .appendTo and remove() are needed for firefox
$(iframe).remove();
};
};
データを送信できるように、入力名と値をエンコードしています。私のサーバーでは、php を使用しているので、これをデコードするには、rawurldecode が必要です。入力の名前を「fileName」および「file」として定義すると、次のように記述できます。
$fileName = rawurldecode($_POST['fileName']);
$file = rawurldecode($_POST['file']);
その後、ダウンロードを強制するには、正しいヘッダーを送信する必要があります。私はこの機能を使用しています:
function download($filename, $file) {
header('Content-disposition: attachment; filename="'.$filename.'"');
header('Content-Type: application/force-download');
header('Content-Length: '. filesize($file));
readfile($file);
}
サーバー側で作成されたために JavaScript からファイルを送信する必要がない場合は、ダウンロード関数にファイルのパスを追加するだけです。
PHP を使用している場合は、fpdf を使用して pdf を生成できます。