node.js | как заархивировать папку?

Рейтинг: 0Ответов: 1Опубликовано: 14.03.2023

Делаю что то наподобие яндекс диска и столкнулся с такой проблемой. Если пользователь захочет скачать папку, ее надо заархивировать и отправить. Как сделать это через стримы, чтобы вышло что то такое?

fs.createReadStream(folderToGet).turnItToZip().pipe(res) // sendFile

Было бы очень хорошо обойтись без сторонних библиотек

Ответы

▲ 0

Сразу прошу не пинать, не проверяю, у Вас будет возможность доработать лично ))

Сжатие есть без сторонних либ

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();