Цель
Мы создаем небольшой сайт, на котором пользователи (клиент-браузер) выбирают файлы изображений (284 КБ на файл), а затем запрашивают сервер Node Express для объединения их в ZIP-файл для загрузки в веб-клиент.
Проблемы и ограничения дизайна
- Результирующий ZIP-файл может иметь размер порядка 50 МБ - 5 ГБ. Поэтому мы хотели бы предоставить пользователю работающий индикатор выполнения во время создания ZIP-файла. (Мы предполагаем, что браузер будет постоянно обновлять информацию о ходе фактической загрузки).
- Пока мы ожидаем небольшой объем запросов (1-2 запроса за раз). Однако мы не хотим полностью загружать процессор нашего 4-ядерного сервера, поэтому мы хотим свести к минимуму синхронные вызовы, которые задействуют экспресс-сервер.
- Учитывая размер ZIP, мы не можем ожидать, что zip будет собран только в памяти.
- Есть ли какие-либо другие проблемы, о которых нам следует беспокоиться?
Вопрос
Мы предполагаем, что запуск 7zip в качестве дочернего процесса — это плохо, поскольку мы не получим никакого рабочего статуса относительно того, сколько файлов размером 258 КБ было добавлено в ZIP.
Итак, какие из следующих пакетов очень дружественны к Node/ExpressJS, учитывая ограничения/цели дизайна, перечисленные выше?
- архиватор: https://www.npmjs.com/package/archiver
- jszip: https://www.npmjs.com/package/jszip
- easyzip: https://www.npmjs.com/package/easy-zip
- expresszip: https://www.npmjs.com/package/express-zip
- zipstream: https://www.npmjs.com/package/zip-stream
Что я вижу выше, так это то, что большинство пакетов сначала собирают файлы, а затем финализируют их в памяти, а затем направляют их в http-запрос (вероятно, не подходит для 5 ГБ данных или я что-то упустил). Некоторые, кажется, могут использовать диск, но вопрос будет в том, будут ли получать события обновления при добавлении каждого файла?
Другие кажутся полностью асинхронными, и я не понимаю, как вы могли бы получить текущее значение прогресса при добавлении каждого файла в ZIP-пакет.