【问题标题】:Send binary data from nodejs (request) to java (ZipInputStream)从nodejs(请求)发送二进制数据到java(ZipInputStream)
【发布时间】:2017-12-19 13:49:28
【问题描述】:

由于某种原因,在 nodeJS 上生成的 zip 文件在您只能使用“二进制”数据上传的 Java 服务器上被拒绝。

如果我使用 Postman 使用二进制文件发布文件,它可以正常工作,但是通过 nodeJS (request/request-promise/http ...etc) 发送时它不起作用。

它给出:

java.util.zip.ZipException: only DEFLATED entries can have EXT descriptor
        at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:310)
        at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)
        at com.ws...

文件有效(通过邮递员接受!)

【问题讨论】:

    标签: java node.js upload binary


    【解决方案1】:

    在这个问题上花了将近两天时间。通读大量关于堆栈溢出的帖子(其中大多数在这个特定主题中没有正确的答案)并四处搜索,但所有的努力都是徒劳的。

    我一直在尝试,唯一似乎可以正常工作的解决方案是使用子进程和 curl...

    万一其他人陷入这个非常烦人的问题:

    var exec = require('child_process').exec;
    
    var args = "-X POST \
      https://mywebsite.com/zip-upload \
      -H 'Authorization: Bearer gFChWxzeCIZVLM2q...WlvDB6zq2uOHfUcdX' \
      -H 'Cache-Control: no-cache' \
      -H 'Content-Type: application/zip' \
      --data-binary @./data.zip";
    
    exec('curl ' + args, function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
      if (error !== null) {
        console.log('exec error: ' + error);
      }
    });
    

    【讨论】:

      【解决方案2】:

      在我看来,child_process 是最后的选择。如果您尝试过 requestrequest-promise 并失败了,试试 htp

      const htp = require('htp');
      htp.post(
          "https://mywebsite.com/zip-upload", 
          { "Authorization" : "earer gFChWxzeCIZVLM2q...WlvDB6zq2uOHfUcdX"
          , "Cache-Control" : "no-cache"
          , "Content-Type"  : "application/zip"
          },
          fs.createReadStream("./data.zip")
      )
      .then(function(response) { /* ... */ })
      .catch(function(error) { /* ... */ })
      ;
      

      【讨论】:

      • 谢谢,但这不能以二进制形式发送数据。 (见标题和卷曲标志)
      【解决方案3】:

      我遇到了类似的问题。就我而言,我使用Content-Type 的自定义值(例如 - “application/abc+json”)通过fetch() 中的POST 请求上传一个zip 文件。它在 Postman 中工作,但不在 nodejs 服务器中。

      在通过 fetch() 发出请求之前,我可以通过添加 Content-Length 作为标头来使其工作

      我使用的请求标头 - Content-TypeContent-LengthAuthorization 和一堆其他 API 特定标头。

      希望这可以帮助任何面临问题的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        相关资源
        最近更新 更多