Отправить объект Decipher / Cipher с запросом () в API с помощью multer - PullRequest
0 голосов
/ 02 октября 2018

У нас есть два API в Node.js.Первый действует как основной концентратор, а другой используется для отправки электронных писем.

В настоящее время у меня есть некоторые файлы, которые зашифрованы и хранятся в файловой системе первого 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 голосов
/ 12 июня 2019

Хорошо, так что после некоторого копания я забыл об этом вопросе здесь.Я разместил решение моей проблемы в выпуске 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); 
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...