gpt4 book ai didi

javascript - 如何从 php 服务器获取带有 $.ajax 的 zip

转载 作者:可可西里 更新时间:2023-11-01 00:20:05 24 4
gpt4 key购买 nike

当 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');
}
}
);

发生了什么:

  1. 服务器创建了我要求的 zip 文件,并且该文件没有损坏。其中包含 shouldBeThere.json。
  2. 服务器向前端发送数据。
  3. 控制台日志(数据); javascript 中的行打印的字符串与我通过使用文本编辑器打开在服务器上创建的 zip 文件得到的字符串几乎相同。
  4. console.log(data.length);根据 chrome 的 devtools,javascript 中的行打印一个小于响应 header 内容长度的数字。可能是数据损坏的提示。
  5. saveAs 创建一个 zip 文件,其中包含它想要的文件,名称正确,但是当我尝试解压缩它时,7zip 显示错误:“试图将文件指针移动到文件开头之前”。6.JSZip 似乎加载了数据,但随后 zip.file('shouldBeThere.json') 为空。

问题是我不知道问题是来自 php 还是来自 javascript。我不知道是 php 发送了损坏的 zip 还是 javascript 没有正确读取它。

我已经尝试了我在 Internet 上找到的所有 php header 组合和方法。我还尝试在 javascript 中做一些不同的事情:使用 ArrayBuffer 而不是 Uint8Array,将字节而不是数据传递给 zip.load(),在 Blob() 中使用 {type: "application/octet-stream"}。

最佳答案

终于找到了解决方法:必须指定ajax接收到的数据类型,然后将这个unicode数据转换成字符。这是我的新 JavaScript 代码:

$.ajax(
{
url: myUrl,
type: 'POST',
data: {
"leData" : "some_data"
},
context: document.body,
cache: false,
dataType: 'text', //solution code
mimeType: 'text/plain; charset=x-user-defined', //solution code
success: function(data) {
console.log(data);
console.log(data.length);
newContent = ""; //solution code
for (var i = 0; i < data.length; i++) { //solution code
newContent += String.fromCharCode(data.charCodeAt(i) & 0xFF); //solution code
}
var bytes = new Uint8Array(newContent.length); //modified
for (var i=0; i<newContent.length; i++) { //modified
bytes[i] = newContent.charCodeAt(i); //modified
}
blob = new Blob([bytes], {type: "application/zip"})
saveAs(blob, "test.zip");
zip.load(newContent); //modified
jsonData = JSON.parse(zip.file('shouldBeThere.json').asText());
},
error: function() {
alert('error');
}
}
);

我的 PHP 代码很好,它甚至可以在没有标题的情况下运行。这是我需要的最少 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');

echo file_get_contents($file . '.zip');

this 启发的解决方案

关于javascript - 如何从 php 服务器获取带有 $.ajax 的 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29516515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com