WebサーバーでC言語の組み込みデバイスをプログラミングしています。 1つのタスクは、このデバイスからファイルをダウンロードすることです。私は一度にserveralファイルをダウンロードしたいので、POSTリクエストとzipファイルを返すためのファイル名を使用してajax-requestを作成しました(私はこれらのzip-fileを自分のデバイス上に作成します)。すべて正常に動作しますが、ダイアログボックスsave as
はzipファイル全体が送信された後に表示されます。ajax - >ダウンロードする前にダイアログとして保存
サーバー側では、デバイスは200 OK
- 、Content-Type: application/octet-stream
- 、Content-Disposition: attachment; filename="testzip.zip"
- ヘッダーを送信しています。
は、クライアント側で私は(stackoverlfow: Handle file download from ajax postからこれを得た)このjavascriptのコードを使用して:
function downloadFiles(filenames) {
var xhr = new XMLHttpRequest();
xhr.open('POST', /file-save/, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (this.status === 200) {
var filename = "test.zip";
var type = xhr.getResponseHeader('Content-Type');
var blob = new Blob([this.response], { type: type });
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
// use HTML5 a[download] attribute to specify filename
var a = document.createElement("a");
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
}
};
xhr.send(filenames);
}
ザ・if文if (this.status === 200)
ファイル全体が送信されたときに、到達しました。ファイルのサイズが小さい場合、ユーザーは時間の不足を認識していないため、問題はありません。しかし、ファイルがダウンロードされているにもかかわらず、ユーザーはダウンロードを見ることができない約50MBのファイルです。私の考えでは、理由はa.click()
です。なぜなら、クリックメソッドはダウンロードの開始を模倣するからです。
私に解決策やヒントを教えてくれる人はいますか? ところで、jqueryはオプションではありません!任意の助け
おかげ
EDIT:私の目標は、私が保存する場所との対話を取得する大容量のファイル、とのすべてのウェブページ上のようなファイルをダウンロードすることであると私は、ダウンロード-進行状況を確認することができます。
SOLUTION(君ダーブからヒント):
function downloadFiles(filenames) {
var xhr = new XMLHttpRequest();
xhr.open('POST', /file_save/, true);
xhr.onload = function() {
if (this.status === 200) {
var mydisp = xhr.getResponseHeader('Content-Disposition');
var save_response = xhr.responseText;
var var_json_format = JSON.parse(save_response);
/* check for errors */
if(var_json_format["error"]) {
return;
} else {
status = _.findWhere(var_json_format["link"], {id : 'status'}).value;
download_id = _.findWhere(var_json_format["link"], {id : 'download_id'}).value;
}
if(status != "active") {
return;
}
var filename = "test.zip";
var downloadUrl = "/file_save/" + download_id;
var a = document.createElement("a");
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup
}
};
xhr.send(filenames);
return;
}
リンクした質問に定義されているAjaxを使用できます。 'success:ではなく' ajaxでは 'complete:'を使うことができます。これはajaxリクエストが完了したときに呼び出されます。 –
しかし、これはjquery-solutionですか? – Chris
はい私の知識によればあなたは正しいです –