node.js Загрузка файла через криптопоток - PullRequest
0 голосов
/ 10 апреля 2020

Мой бэкэнд ожидает multipart/form-data POST-запрос для обработки загрузки файла и его сохранения. Он работает с обычными файлами, поэтому я знаю, что бэкэнд (express + multer) не является проблемой.

Я пишу клиентское приложение в узле для чтения файла, зашифровываю его с помощью crypto Зашифруйте AES и загрузите зашифрованный файл.

Текущий лог c передачи потока ввода в шифр, построения фрагментов зашифрованного содержимого, объединения их в память и загрузки окончательного буфера в конце работы:

const crypto = require('crypto');
const fs = require('fs');
const FormData = require('form-data');

//Some more setup which is omitted

let cipher = crypto.createCipheriv(algo, key, iv);
let chunks = [];

const input = fs.createReadStream("test.txt");
input.pipe(cipher)

cipher.on("data", (chunk) => {
    chunks.push(chunk);
});

cipher.on("end", () => {
    let finalBuf = Buffer.concat(chunks);

    let form = new FormData();
    form.append("the_file", finalBuf, {
        filename: "test.txt",
        contentType: "application/octet-stream",
    });

    form.submit(API_BASE + API_UPLOAD, (err, res) => {
        res.resume();
    });
});

Однако для больших файлов это, вероятно, плохая идея, и я уверен, что это можно сделать лучше, поскольку form-data поддерживает загрузку «читаемых» потоков. Например, form.append("the_file", fs.createReadStream('test.txt')); работает для загрузки открытого текста. Есть ли способ сделать это и для зашифрованного потока? Если не использовать form-data, то, возможно, другой метод?

Я попытался

    form.append("the_file", cipher, {
        filename: "test.txt",
        contentType: "application/octet-stream",
    });

, но на бэкэнде я получаю сообщение об ошибке "Неожиданный конец многокомпонентных данных", поэтому я думаю, что это не так я использую шифр aes-256-cbc, если это имеет значение.

...