Node.js中有两个API。第一个用作主要集线器,而另一个用于发送电子邮件。
目前,我有一些文件已加密并存储在第一个API的文件系统中。使用以下功能解密文件:
decryptFile: function (filePath, callback) {
var fileName = path.basename(filePath);
var encryptedFilePath = path.dirname(filePath) + '/' + this.encryptText(fileName);
// input file
var fileDecipher = encryptionKeys.crypto.createDecipher(encryptionKeys.algorithm, encryptionKeys.password);
var r = fs.createReadStream(encryptedFilePath);
// decrypt content
r.on("error", function (err) {
if (err) {
callback(err);
}
});
return callback(null, r.pipe(fileDecipher));
}
要发送文件,我们使用:
utils.files.decryptFile(fullPath, function (err, decryptedFile) {
requestOptions = {
url: pushAPIURL + 'email/send',
method: "POST",
formData: {
attachments: [decryptedFile]
},
headers: {
authorization: global.PUSHToken
}
// json: body
};
return request(requestOptions);
});
因此,我们收到:
错误:由于多部分数据的意外结束,部分提前终止了
在邮件API上
关于请求中可能缺少什么的任何想法?
谢谢
答案 0 :(得分:0)
好的,所以经过一番挖掘,我忘记了这里的问题。我在表格数据的GitHub问题https://github.com/form-data/form-data/issues/409#issuecomment-432202588
中发布了针对我的问题的解决方案如果以上不再可用,这是原始答案:
因此,解决方案归功于: https://github.com/form-data/form-data/issues/356#issue-234978025
似乎确实与流的已知长度丢失有关+ 似乎缺少其他一些元数据字段。在文件上 解密功能,我添加了对流长度的计数 每个块:
let file, length = 0; // decrypt content r.on("error", function (err) { if (err) { callback(err); } }); r.on("data", function (chunk) { // console.log("data"); length += chunk.length; }); r.on("end", function () { // console.log("end"); return callback(null, file, fileName, length); }); file = r.pipe(fileDecipher);
然后,在发送请求的文件上,添加以下内容
utils.files.decryptFile(fullPath, function (err, decryptedFile, filename, >length) { decryptedFile.httpVersion = "1.0"; decryptedFile.name = filename; decryptedFile.headers = {'content-length': length}; requestOptions = { url: pushAPIURL + 'email/send', method: "POST", formData: { attachments: [decryptedFile] }, headers: { authorization: global.PUSHToken } }; return request(requestOptions); });