将文件内容作为二进制输出为 AJAX 响应


Outputting file contents as binary as AJAX response

好吧,标题没有给出太多方式,所以让我解释一下我非常奇怪的设置。

涉及两个服务器:

  • 网站: 远程
  • 本地
  • 主机:本地计算机

工作流程如下:

  • 该站点通过跨域 AJAX 调用本地主机
  • 作为响应,localhost通过PHP的ZipArchive库动态创建一个ZIP文件
  • localhost 将构成归档的原始数据作为 AJAX 响应进行传达
提出

请求并提出存档 - 一切都很好。存档是可打开的,一切都很好。我现在坚持的是如何将该存档传达为 AJAX 响应,以便可以"再次组合"(如 Humpty Dumpty)。当我目前执行此操作(通过 file_put_contents() )时,它在打开时出错,说它无效。目前,我只是输出存档的原始数据:

echo file_get_contents('path/to/archive.zip');

这很好,但在响应中发送乱码。我对编码和标头了解不多,所以如果这看起来很明显,请道歉。

对于响应,我应该希望将其转换为二进制,还是发送某些标头等?我尝试发送多部分/表单数据标头,但没有骰子。标题不是我的强项。

请注意,在这种情况下,cURL 不是一个选项,否则我会笑。

您必须使用 Blob javascript 类将 zip 文件作为二进制数据读取。

这是来自 Mozilla 文档的代码片段

var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true);
oReq.responseType = "arraybuffer";
oReq.onload = function(oEvent) {
  var blob = new Blob([oReq.response], {type: "application/octet-stream"}); //
  // you have nothing to do with the blob...
  // ...
};
oReq.send();

然后使用 POST 方法将此文件 (blob) 发送到目标

var oReq = new XMLHttpRequest();
oReq.open("POST", url, true);
oReq.onload = function (oEvent) {
  // Uploaded.
};
oReq.send(blob); //the blob that you loaded
您可以在Mozilla的文档中阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data