web-dev-qa-db-ja.com

Content-Disposition:添付ファイルがダウンロードダイアログをトリガーしない

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呼び出しを行うことで、なんとか機能させることができました。しかし、これは醜いハックであり、まだよりエレガントな解決策を探しています。

15
Yaron Schwimmer

ヘッダーは問題ではありません。問題は、ajax呼び出しを介してダウンロードURLを照会していることです。これにより、ブラウザーのダウンロードダイアログが呼び出されません。オプションは次のように要約されます。

  1. ダウンロードURLに送信されたフォームを使用してください。ユーザーが操作する必要のあるフォームを表示する代わりに、JavaScriptを使用してフォームを作成し、form.submit -- ajax postからのファイルダウンロードを処理する を呼び出してプログラムで送信します。

  2. window.locationをダウンロードURLにポイントします。現在のウィンドウでこれを行うことができます- ajaxリクエストを使用してファイルをダウンロードする 、または新しいウィンドウで行う- res.download()が私の場合機能しない

21
Roman Pletnev

別のcontent-typeを使用して、ブラウザーでテキストファイルとして開かないようにすることができます。

Content-Type:application/ms-Excel; charset=UTF-8

別の方法としては、application/octet-streamをmime-typeとして使用して、より適切な説明のないダウンロード可能なファイルとして定義することができます。

Content-Type:application/octet-stream; charset=UTF-8
0
MQ87

質問はこれに似ています

PHPを介してIframeからファイルをダウンロードしているときに[名前を付けて保存]ダイアログボックスを表示

基本的なアイデアは、Romanが上で説明した2番目のオプションですが、これはiframeを使用して実現しています。

0
Pawel Zieminski