我試圖在jquery的$ .ajax請求時發送php服務器生成的zip文件。
這是我的代碼:
PHP:
$file = tempnam($a_folder_path, "zip");
$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);
$zip->addFile($path_to_json, 'data.json');
$zip->close();
rename($file, $file . '.zip');
$filename = basename($file . '.zip');
$filepath = $file . '.zip';
while (ob_get_level()) {
ob_end_clean();
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath));
ob_end_flush();
echo file_get_contents($filepath);
//@readfile($filepath);
的javascript:
$.ajax(
{
url: myUrl,
type: 'POST',
data: {
"leData" : "some_data"
},
context: document.body,
cache: false,
success: function(data) {
console.log(data);
console.log(data.length);
var bytes = new Uint8Array(data.length);
for (var i=0; i<data.length; i++) {
bytes[i] = data.charCodeAt(i);
}
blob = new Blob([bytes], {type: "application/zip"})
saveAs(blob, "test.zip");//trying to access data with FileSave.js
zip.load(data);//trying to access data with JSZip.js
jsonData = JSON.parse(zip.file('shouldBeThere.json').asText());
},
error: function() {
alert('error');
}
}
);
會發生什麼:
- 服務器創建的zip文件,我問它,並且這個文件沒有損壞。其中包含shouldBeThere.json。
- 服務器將數據發送到前端。
- console.log(data);在JavaScript中打印一個字符串與我通過使用文本編輯器打開在服務器上創建的zip文件所得到的幾乎相同。
- console.log(data.length);根據chrome的devtools,在javascript中輸入的行數小於響應頭的內容長度。也許提示數據損壞。
- saveAs使用正確的名稱創建一個包含文件的zip文件,但是當我嘗試解壓縮文件時,7zip顯示錯誤:「嘗試在文件開始之前移動文件指針」。 6.JSZip似乎加載數據,但然後zip.file('shouldBeThere.json')爲空。
問題是我不知道如果問題來自PHP或從JavaScript。我不知道如果PHP發送損壞的zip或如果JavaScript不正確讀取它。
我已經嘗試了所有在互聯網上找到的php頭組合和方法。我也嘗試在javascript中做不同的事情:使用ArrayBuffer而不是Uint8Array,在Blob()中使用{type:「application/octet-stream」}將字節而不是數據傳遞給zip.load()。
AJAX是不適合這個。你可以使用'窗口。打開(url);'URL是鏈接到你的php文件的地方。由於它下載一個文件,窗口將會彈出一秒鐘。 – Slim
類似的問題已經在這裏找到答案: http://stackoverflow.com/questions/23676748/download-zip-file-with-jquery-from-ajax-post-request – Erick
首先,檢查問題來自PHP。 轉到您可以下載zip文件的URL(直接下載)並檢查是否可以解壓文件。 如果是的話,問題來自JS。 查看你的代碼後,你不會設置ajax「響應類型」,默認是「text/html」...對於一個大文件,這不是文本而是二進制,你可以使用「Blob」或「arraybuffer」但我不確定,你必須創建一個JSFiddle – Jordan