NodeJSサーバーでファイルダウンロード機能を作成しようとすると、予期しない動作が発生しました。サーバー上にCSVファイルを作成し、res.download('path/to/file')
を使用してダウンロードをトリガーするエクスポートデータ関数を呼び出すREST(express)APIがあります。応答ヘッダーには次のものが含まれます。
Content-Disposition:attachment; filename="indicators.csv"
Content-Length:30125
Content-Type:text/csv; charset=UTF-8
だからすべてが順調に見えます。
問題は、サーバーからプレーンテキストとして応答を受け取ることです。応答には、CSVファイルに含まれるすべてのデータが含まれていますが、意図したようにブラウザーのファイルダウンロードダイアログがトリガーされません。 Chrome=とFFの両方で試してみました。問題は両方で解決しません。
何か案は?
更新
私はダミーのフォームを作成し、その送信アクションを使用して私のAJAX呼び出しを行うことで、なんとか機能させることができました。しかし、これは醜いハックであり、まだよりエレガントな解決策を探しています。
ヘッダーは問題ではありません。問題は、ajax
呼び出しを介してダウンロードURLを照会していることです。これにより、ブラウザーのダウンロードダイアログが呼び出されません。オプションは次のように要約されます。
ダウンロードURLに送信されたフォームを使用してください。ユーザーが操作する必要のあるフォームを表示する代わりに、JavaScript
を使用してフォームを作成し、form.submit
-- ajax postからのファイルダウンロードを処理する を呼び出してプログラムで送信します。
window.location
をダウンロードURLにポイントします。現在のウィンドウでこれを行うことができます- ajaxリクエストを使用してファイルをダウンロードする 、または新しいウィンドウで行う- res.download()が私の場合機能しない
別のcontent-typeを使用して、ブラウザーでテキストファイルとして開かないようにすることができます。
Content-Type:application/ms-Excel; charset=UTF-8
別の方法としては、application/octet-streamをmime-typeとして使用して、より適切な説明のないダウンロード可能なファイルとして定義することができます。
Content-Type:application/octet-stream; charset=UTF-8
質問はこれに似ています
PHPを介してIframeからファイルをダウンロードしているときに[名前を付けて保存]ダイアログボックスを表示
基本的なアイデアは、Romanが上で説明した2番目のオプションですが、これはiframeを使用して実現しています。