使用multer将带有request()的解密器/密码对象发送到API

时间:2018-10-02 16:19:54

标签: node.js express multer

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上

关于请求中可能缺少什么的任何想法?

谢谢

1 个答案:

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