node.js | как заархивировать папку?
Делаю что то наподобие яндекс диска и столкнулся с такой проблемой. Если пользователь захочет скачать папку, ее надо заархивировать и отправить. Как сделать это через стримы, чтобы вышло что то такое?
fs.createReadStream(folderToGet).turnItToZip().pipe(res) // sendFile
Было бы очень хорошо обойтись без сторонних библиотек
Ответы (1 шт):
Автор решения: Evgeniy Leonidov
→ Ссылка
Сразу прошу не пинать, не проверяю, у Вас будет возможность доработать лично ))
Сжатие есть без сторонних либ
const fs = require('fs');
const zlib = require('zlib');
const archiver = require('archiver');
Путь к папке
const folderToGet = '/path/to/folder';
Создай поток для записи архива
const archive = archiver('zip', { zlib: { level: 9 } });
archive.on('warning', err => {
if (err.code === 'ENOENT') {
console.warn('Warning:', err.message);
} else {
throw err;
}
});
archive.on('error', err => {
throw err;
});
Собери всё что в папке в архив
const files = fs.readdirSync(folderToGet);
files.forEach(file => {
const filePath = folderToGet + '/' + file;
archive.file(filePath, { name: file });
});
Отправляем не глядя )
res.setHeader('Content-disposition', 'attachment; filename=archive.zip');
res.setHeader('Content-type', 'application/zip');
archive.pipe(res);
archive.finalize();