Handle zip files in NodeJS

Intro


[ru] Распаковка zip архива одна из самых часто встречающихся кейсов при разработке настольных программ, или серверов. 

На практике размеры архивов и количество файлов находящиеся в них, могут сильно различаться. Это могут быть как архивы размеров < 5mb, с 10 файлами внутри, так и огромные файлы размеров > 30gb с десятками тысяч разных файлов (картинок, .json файлов) внутри.

Каким же образом нужно работать с такими архивами, какой же алгоритм действий следует использовать при обработке архива любого веса и из любого источника? В данной статье мы рассмотрим основные готовые решения для работы с zip файлами, а также попробуем написать свое! 

Practice part

Перед тем как приступить к примером с кодом, и непосредственном обзоре библиотек, хочу привести немного опыта из реальной практики.

  • Очень редко работа zip архивов проходит без ошибок, они могу быть с битыми данными внутри, у файла могут отсутствовать правильный заголовок у файла,              файл может быть заблокирован паролем.

  • Нужно также принять во внимание, что сами архивы могут быть созданными разными программами для их архивации. Это может быть как нативный проводник к ОС, так и сторонние программы. (например WinRAR, или 7zip)

  • Архивы могут быть разбиты на несколько частей (например для FAT32 систем, где стоит ограничения для размера файлов < 4gb)

NPM пакеты

Здесь я укажу 5 самых популярных библиотек для работы с zip файлами.

node-unzip 

https://www.npmjs.com/package/unzip

Очень старая (последнее обновление ~ 5 лет назад), но все еще актуальная (порядка 100.000 скачиваний).

Плюсы:

- Поддерживает поиск по entry точкам внутри архива. Можно вытащить конкретный и нужный нам файл из архива.

- Довольно прост с точки зрения методов API.

- есть поддержка стримов.

Минусы: 

 - Библиотека не поддерживается автором. (Мало примеров использования)

 - Есть проблемы с NodeJS 12.

 - Не поддерживает загрузку в памяти чанков, грузить сразу весь архив.

 - Под капотом используется zlib, который уже в статусе deprecated. 


Код-пример

Тесты & замеры (версия на время тестирования 0.1.11)

node-stream-zip

https://www.npmjs.com/package/node-stream-zip

Плюсы:

 - активно поддерживается, и развивается. Есть хорошая документация и описание.

 - есть поддержка стримов.

Минусы:

- В качестве ошибок, выбрасываются строки, а не объект ошибки, мы теряем из-за этого stack-trace.

Код-пример

Тесты & замеры (версия на время тестирования 1.8.2)

...Article in a progress of writing.

  • Slider

You may also like

  • Slider
  • Slider
2 comments

John Doe

Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non | numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.

Reply