将nodejs(request)中的二进制数据发送到java(ZipInputStream)

时间:2017-12-19 13:49:29

标签: java node.js upload binary

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

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

它给出了:

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...

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

3 个答案:

答案 0 :(得分:0)

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

我一直在试验,唯一合适的解决办法就是使用子进程和卷曲......

如果其他人陷入这个非常烦人的问题:

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);
  }
});

答案 1 :(得分:0)

在我看来, child_process 是最后的选择。如果您已尝试请求请求承诺但失败了,请尝试 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) { /* ... */ })
;

答案 2 :(得分:0)

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

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

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

希望这可以帮助任何遇到问题的人。