Мой бэкэнд ожидает 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
, если это имеет значение.