これは、さまざまな方法で尋ねられる一般的な質問です。以下にいくつかのリンクを集めて、それらが機能しない理由を説明します。以下の完全な解決策を探しています。
私が開発しているWebアプリケーションでは、次の要件を持つAJAX風のファイルをダウンロードする必要があります
- ユーザーはリンクをクリックしてファイルをダウンロードできます。新しいページに移動することなく、通常の「名前を付けて保存..」ダイアログが表示され、Web ブラウザーでファイルをダウンロードするのに慣れています。
- 何らかの理由でサーバーがファイルの提供に失敗した場合は、javascript コールバックを呼び出す必要があります。同様に、サーバーがファイルを正常に提供した場合
- HTTP要求ヘッダーを変更して、要求のContent-Type HTTP ヘッダーなどを指定できるようにする必要がある
- すべての A グレード ブラウザをサポート
これまでに調べたこと:
a. jquery.fileDownloadは、フォーム送信、非表示の iframe、およびサーバーに特定の Cookie を設定させることを組み合わせて使用することにより、要件 1、2、および 4 を非常にエレガントに解決します。私はこのプロジェクトに非常に精通しています (これにも貢献しています)。ただし、要件 3 はサポートされていません。これは、HTML フォームの送信と iframe (このライブラリが使用するもの) では、要求されたサーバー リソースに HTTP ヘッダーを指定できないためです。( jdownloaderも同様の iframe/form 手法を使用しますが、要件 3 も解決しません)。
b. XMLHttpRequest を使用してファイルからバイナリ データを取得することは可能です (さまざまなブラウザーのさまざまなハック ( link 1、link 2、link 3、link 4、link 5、link 6、link 7、link 8 ) を使用)。しかし、それらのどれも要件 1 に対応します。バイナリ データは JavaScript 変数に保存できますが、ブラウザの [名前を付けて保存] ダイアログを呼び出して、ユーザーがこのバイナリ データをハード ドライブ上のファイルに保存できるようにする方法はありません。
c. このリンク( 「DOWNLOAD + SAVE FILES TO THE HTML5 FILE SYSTEM」という見出しの下) には、XHR2 を使用した完全なエンドツーエンドのソリューションがあり、要件 1、2、および 3 に対応しています。 )。
そこに完全な解決策はありますか?
編集 さらにいくつかのオプションがあります-テストする予定です。おそらく唯一の選択肢は、普遍的な解決策を作成するためにすべてのハック/解決策を集めて、この問題のライブラリを開発することです。
以下のファイバーテックのソリューションによると:上記のソリューション(b)を使用してファイルを変数に保存してから:
Internet Explorer の場合: IE の execCommand() を使用してこのデータを保存します。
その他の場合: data uris ( link 2 ) と<a> タグの HTML5ダウンロード属性を使用して名前を指定します ( link 1、link 2、link 3、link 4 )
このリンクは、キャンバスのファイルダウンロード機能の使用に関係することについて言及しています
Downloadify (およびこのリンクも)
Webワーカーに関係する一見関連性のあるリンクですが、ファイルを生成するためにBlobとFileApiで何かを行っています。