やりたいこと
jpgなどブラウザで直接表示されてしまうファイルをJavaScriptでPOSTで強制ダウンロードさせたい。
大きいデータもあるためストリームさせたく、一度blobで受け取り改めて保存させる方式は避けたい。
php
1/* 2POSTで情報受け取り処理 3・・・ 4・・・ 5*/ 6 7$file = './test.jpg'; 8 9header('Content-Type: application/force-download'); 10header('Content-Length: '.filesize($file)); 11header('Content-Disposition: attachment; filename="sample.jpg"'); 12readfile($file);
POSTの理由
- リクエスト内容に応じてDL対象ファイルを動的にするため
- 単純な直リン(URLシェア等)を簡単に防ぎたいため
試したこと
HTMLのFORMやハイパーリンク(GET)であれば、期待通りダウンロードが始まりました。
JavaScriptで非同期通信をした場合はバイナリデータをそのまま受け取ってしまいダウンロードが始まりませんでした。
→ Content-Type: application/force-downloadヘッダが無視される
JavaScript
1let data = new FormData; 2 3data.append('test1', 'hoge1'); 4data.append('test2', 'hoge2'); 5 6axios.post('/download', data) 7 .then((response) => { 8 //何も起こらない(レスポンス内容は対象のバイナリデータ) 9 }) 10 .catch((error) => { 11 console.log(error); 12 })
非同期で該当ヘッダが無視される原因はブラウザのセキュリティでしょうか?
(特にコンソールにエラー類は出ていない)
もしくは手法が違えばご教示お願いいたします。
最終手段としてjsでformを生成してsubmitさせれば実現できるとは思いますが、
あまりスマートではない気がしまして質問させていただきました。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/21 21:45