【问题标题】:Corrupt zip when uploading via Axios POST通过 Axios POST 上传时损坏的 zip
【发布时间】:2020-04-28 08:01:32
【问题描述】:

我正在通过 REST 端点将 zip 文件“发布”到服务器应用程序。如果我通过 Postman 或应用程序的前端发布,我会得到一个有效的已发布 zip 文件。我可以转过来下载,打开等等。

如果我尝试对我的代码和 Axios 执行相同的操作,则服务器应用程序尝试解压缩并使用我上传的内容会失败。如果我对存档进行 DL,则它已损坏。相同的存档通过 Postman 和应用程序的 UE 工作的事实告诉我,这要么是 PEBKAC,要么可能是 Axios 本身的问题。这是我用来 POST 到端点的代码。请注意,最后,我实际上是将 POST 的数据作为 zip 写入我机器上的本地文件,这样我可以验证当我通过 fs 读取文件时我没有做任何愚蠢的事情。我创建的文件的本地副本很好而且很漂亮。

请注意我实际上是如何硬编码内容长度的。我正在使用单个文件进行测试,并且我已经通过 fs.statSync 验证了长度是正确的,并且它与我通过 Postman 和应用程序的 UE 上传时看到的 Content-Length 匹配。

var uploadFile = (data, fileInfo) => new Promise(resolveUpload => {

    console.log("Starting Upload API call for:", fileInfo.description);

    axios.post(aepServer + '/api/v1/files',
            data, {
                jar: cookieJar,
                withCredentials: true,
                headers: {
                    'Content-Type': 'application/octet-stream',
                    'path': fileInfo.path,
                    'description': fileInfo.description,
                    'Content-Length': 354198,
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept': '*/*',
                    'Connection': 'keep-alive'

                },
                // DANGER: allow self-signed certs workaround which I must remove 
                httpsAgent: new https.Agent({
                    rejectUnauthorized: false,
                })
            }).then((response) => {
            fileResponse = response.data;
            console.log('\n', chalk.bgMagenta('FILE UPLOADED: '), response);
            fs.writeFileSync('c:\\data\\newfile.zip', data, 'binary');
            resolveUpload(fileResponse);
        })
        .catch((err) => {
            console.log("AXIOS ERROR: ", err);
        })
});

这里看起来有什么问题吗?在查看响应对象时,我确实看到了一些让我摸不着头脑的东西:

headers: {
  Accept: '*/*',
  'Content-Type': 'application/octet-stream',
  path: '/Workspaces/Public%20Apps/UFOs.yxzp',
  description: 'UFO Sitings in the US, 1995 to present',
  'Content-Length': 532362,
  'Accept-Encoding': 'gzip, deflate, br',
  Connection: 'keep-alive',
  Cookie: 'ayxSession=s%3Ac39f55a3-b219-43a5-9f8a-785e1222c81c.QR4KI8uXaQlL9axqkO8AkyabPVt3i37nGbz%2FJef0eqU',
  'User-Agent': 'axios/0.19.2'
},

看内容长度:532362字节。似乎我在标题中硬编码的 ~354k 值被某种方式忽略了。这可能是我的问题吗? [顺便说一句,如果我使用相同的代码上传 csv 或 txt 文件,一切都很好——这似乎只与压缩文件有关]

编辑:Welp,看起来 Axios 确实覆盖了该属性,我对此无能为力:Axios set Content-Length manually, nodeJS。现在的问题是,如果设置不正确会影响文件,为什么值是错误的。当我执行 data.length 时,我得到 354198 值。

【问题讨论】:

    标签: javascript node.js axios


    【解决方案1】:

    你可以试试'multipart/form-data'

    axios.post('upload_file', formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
    

    或者使用 postman 获取 CURL 请求并使用 postman 提供的标头信息

    【讨论】:

    • 使用表单数据没有变化。来自邮递员的 cURL 请求实际上传递的信息较少: curl --location --request POST 'localhost/api/v1/files' \ --header 'Content-Type: application/octet-stream' \ --header 'descrption: 最好的文件之一,永远'\ --header '路径:/Workspaces/Public%20Apps/UFO2s.yxzp' \ --header '内容类型:应用程序/八位字节流' \ --header 'Cookie:ayxSession=s%3Add6ba65f-509b -49d5-b286-d854b7a2e1d8.KD8O8uxj%2FWqWHdT6XB4BPLLmSSlTAqX23l8wBv18Fd4' \ --data-binary '@/C:/demo-seeder/要上传的文件/工作区/公共应用程序/UFOs.yxzp'。
    • --data-binary 参数让我想知道问题是否出在我 fs.reading 文件的方式上,但这似乎没问题。
    【解决方案2】:

    我的答案在这里:

    Reading binary data in node.js

    本质上,当我根本不应该传递任何东西时,我将 zip 文件作为“二进制”读取。

    var content = fs.readFileSync(aFile.readFrom);
    //NOT
    //var content = fs.readFileSync(aFile.readFrom, 'binary');
    

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多