为什么我无法从POST请求中提取zip文件?

我有一段客户端代码,用于从Google Drive中导出.docx文件并将数据发送到我的服务器。 它非常简单直接,它只是导出文件,将其放入Blob中,并将Blob发送到POST端点。

gapi.client.drive.files.export({
    fileId: file_id,
    mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
}).then(function (response) {

    // the zip file data is now in response.body
    var blob = new Blob([response.body], {type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"});

    // send the blob to the server to extract
    var request = new XMLHttpRequest();
    request.open('POST', 'return-xml.php', true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.onload = function() {
        // the extracted data is in the request.responseText
        // do something with it
    };

    request.send(blob);
});

这里是我的服务器端代码来保存这个文件到我的服务器上,所以我可以用它做些事情:

<?php
file_put_contents('tmp/document.docx', fopen('php://input', 'r'));

当我运行这个时,该文件在我的服务器上创建。 但是,我认为它已损坏,因为当我尝试解压缩它时(就像使用.docx所做的那样),会发生这种情况:

$ mv tmp/document.docx tmp/document.zip
$ unzip tmp/document.zip
Archive:  document.zip
error [document.zip]:  missing 192760059 bytes in zipfile
  (attempting to process anyway)
error [document.zip]:  start of central directory not found;
  zipfile corrupt.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)

为什么它不认为它是一个正确的.zip文件?


你应该先下载原始的zip文件,并将它的内容与你在服务器上收到的内容进行比较,你可以这样做。 用totalcommander或line“diff”命令。

当你这样做时,你会看到你的邮编在传输过程中是否发生变化。 有了这些信息,您可以继续搜索为什么它被更改。 例如,当你在zipfile ascii 10被转换为“13”或“10 13”时,它可能是文件传输

因为当你用fopen(..., 'r')在php中打开文件时fopen(..., 'r')它可能发生,当你使用windows时 n符号被转换,你可以尝试使用fopen(..., 'rb')强制BINARY读取文件而不传递行尾。

@see:https://stackoverflow.com/a/7652022/2377961

@请参阅php文档fopen


我认为这可能取决于“application / x-www-form-urlencoded”。 所以当你用php://读取请求数据时,它也会保存一些http属性,所以它的.zip已经损坏。 尝试打开.zip文件并查看里面的内容。 要解决这个问题,如果问题是我之前说过的,试着将Contenent类型改为application / octet-stream。


我建议在发布之前使用base64将二进制数据编码到文本流中,之前我已经完成了这个工作,并且它运行良好,使用二进制数据的url编码是行不通的。 然后在您的服务器上进行64位解码,然后在存储之前转换回二进制文件。

一旦它在base64中,你可以将它作为文本发布。

链接地址: http://www.djcxy.com/p/22157.html

上一篇: Why can't I extract a zip file from a POST request?

下一篇: how to format a POST request on apiary.io?