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

时间:2014-11-22 23:55:50

标签: php ajax binary zip

好吧标题没有多大帮助,所以让我解释一下我非常奇怪的设置。

涉及两台服务器:

  • 网站:远程
  • localhost:本地机器

工作流程如下:

  • 该网站通过跨域AJAX调用localhost
  • 作为回应,localhost通过PHP的ZipArchive lib
  • 动态创建ZIP文件
  • localhost将包含存档的原始数据作为AJAX响应传送

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

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

这很好,但在响应中发送乱码。我对编码和标题知之甚少,所以如果这看起来很明显就道歉。

对于响应,我应该将其转换为二进制,还是发送某些标头等?我尝试发送multipart / form-data标头,但没有骰子。标题不是我的强项。

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

1 个答案:

答案 0 :(得分:1)

您必须使用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