由于某种原因,在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...
文件有效(通过邮递员接受!)
答案 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-Type
、Content-Length
、Authorization
和一堆其他 API 特定标头。
希望这可以帮助任何遇到问题的人。