node.js - использовать архиватор, где вывод является буфером
Я хочу заархивировать несколько readeableStreams в writableStream. Цель состоит в том, чтобы делать все в памяти, а не создавать настоящий zip-файл на диске.
для этого я использую архиватор
let bufferOutput = Buffer.alloc(5000);
let archive = archiver('zip', {
zlib: { level: 9 } // Sets the compression level.
});
archive.pipe(bufferOutput);
archive.append(someReadableStread, { name: test.txt});
archive.finalize();
Я получаю сообщение об ошибке archive.pipe(bufferOutput);
,
Это ошибка: "dest.on не является функцией"
Что я делаю неправильно? Спасибо
ОБНОВЛЕНИЕ:
Я запускаю следующий код для тестирования, и файл ZIP создан неправильно. что мне не хватает?
const fs = require('fs'),
archiver = require('archiver'),
streamBuffers = require('stream-buffers');
let outputStreamBuffer = new streamBuffers.WritableStreamBuffer({
initialSize: (1000 * 1024), // start at 1000 kilobytes.
incrementAmount: (1000 * 1024) // grow by 1000 kilobytes each time buffer overflows.
});
let archive = archiver('zip', {
zlib: { level: 9 } // Sets the compression level.
});
archive.pipe(outputStreamBuffer);
archive.append("this is a test", { name: "test.txt"});
archive.finalize();
outputStreamBuffer.end();
fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { console.log('done!'); });
3 ответа
В вашем обновленном примере, я думаю, вы пытаетесь получить содержимое до того, как оно будет написано.
Подключитесь к финишу и получите содержимое.
outputStreamBuffer.on('finish', () => {
// Do something with the contents here
outputStreamBuffer.getContents()
})
При добавлении прослушивателя событий в архиватор у меня работает:
archive.on('finish', function() {
outputStreamBuffer.end();
// write your file
});
Буфер не является потоком, вам нужно что-то вроде https://www.npmjs.com/package/stream-buffers
Что касается того, почему вы видите мусор, это потому, что вы видите сжатые данные, которые будут выглядеть как мусор.
Чтобы проверить, работает ли архивирование, вы, вероятно, захотите разархивировать его снова и проверить, соответствует ли вывод вводу.