Существует немало npm-пакетов, предназначенных для разбора и обработки multipart/form-data-запросов на Node.js-сервере. Каждый из них спроектирован по-особенному. Некоторые предназначены для использования с Express.js, другие рассчитаны на автономное применение. Некоторые хранят промежуточные файлы на жёстком диске или в памяти, а некоторые — нет. Исследование всех этих пакетов и выбор того, который подойдёт именно вам, может занять определённое время. Материал, перевод которого мы публикуем сегодня, представляет собой руководство, воспользовавшись которым можно выбрать подходящую библиотеку для организации выгрузки файлов на сервер. Тому, кто подбирает подобную библиотеку, автор этого материала рекомендует сначала ответить на следующие вопросы:
- Нужен ли вам Express.js?
- Устроит ли вас сохранение где-либо промежуточных данных, или вы хотите использовать потоковую передачу данных?
- Если сохранение промежуточных данных вас устроит, предпочтёте ли вы, чтобы они хранились бы в памяти, или на жёстком диске?
Краткий обзор популярных пакетов
Здесь мы рассмотрим четыре пакета: Formidable, Busboy, Multer и Multiparty.
Formidable — это одна из самых старых библиотек в нашем обзоре. Её первая версия вышла в 2011 году. У неё, кроме того, больше, чем у других, еженедельных загрузок. Это — автономная библиотека, для работы которой не нужен фреймворк Express.js. Она использует временную директорию на жёстком диске для хранения файлов.
Busboy — это парсер потоковых данных, работа которого основана на событиях. Этот пакет не привязан к Express.js. Busboy не хранит промежуточные файлы. Вместо этого входящие данные обрабатываются в потоковом режиме. Библиотека увидела свет в 2013 году. Ядро реализации обработки multipart/form-data-запросов выделено в отдельный модуль dicer.
Multer — это ПО промежуточного слоя для Express.js. Этот пакет вышел в 2015 году. Он сохраняет промежуточные файлы либо в памяти, либо на диске? и заполняет объект res.files
для получения файлов. Пользователи этого пакета могут тонко управлять полями, предназначенными для загрузки. Есть возможность ограничения количества файлов, выгружаемых на сервер. Внутри Multer используется Busboy.
Multiparty — это форк библиотеки Formidable, который появился в 2013 году. По функционалу — это то же самое, что и Formidable, но, кроме того, этот пакет поддерживает потоковую обработку файлов. Правда, в документации к Multiparty рекомендуется использовать для потоковой обработки данных Busboy, как более быструю альтернативу этого пакета.
Вот сводная таблица по этим пакетам
Formidable | Busboy | Multer | Multiparty | |
Еженедельные загрузки из npm | 2.1 миллиона | 1.2 миллиона | 0.6 миллиона | 0.3 миллиона |
Год появления | 2010 | 2013 | 2015 | 2013 |
ПО промежуточного слоя для Express.js | Да | |||
Поддержка потоков | Да | Да | ||
Сохранение промежуточных данных на диске | Да | Да | Да | |
Сохранение промежуточных данных в памяти | Да |
Использование Formidable или Multer при разработке прототипов и в слабонагруженных проектах
В некоторых ситуациях разработчик может быть не против того, чтобы в системе хранились бы промежуточные файлы. Возможно, речь идёт о разработке прототипа, или о проекте, в котором выгрузкой файлов на сервер будут заниматься всего несколько пользователей с административными привилегиями. В любом случае, в подобной ситуации создателя проекта может не беспокоить тот факт, что память или диск сервера могут оказаться заполненными временными данными. В некоторых случаях это совершенно нормально.
Если вышеописанное напоминает стоящую перед вами задачу — вам осталось подумать лишь о том, нужен ли вам фреймворк Express.js, и о том, предпочитаете ли вы хранить временные данные в памяти или на диске.
▍Обработка файлов без Express.js: Formidable
Если вы хотите обрабатывать загрузку файлов за пределами Express.js, это значит, что у вас есть два варианта: Formidable и Multiparty. Multiparty — это форк Formidable, в который добавлена поддержка потоковой обработки данных. Но даже в документации Multiparty рекомендуется для работы с потоками использовать Busboy. У Formidable, кроме того, в 7 раз больше пользователей, чем у Multiparty. Поэтому, если что-то пойдёт не так, вы с большей вероятностью сможете получить помощь от кого-то, кто знает Formidable, чем от кого-то, кто знает Multiparty.
В подобной ситуации стоит помнить о том, что при использовании Formidable у вас не будет возможности хранить временные файлы в памяти. Их можно будет хранить только на диске.
▍Хранение временных файлов в памяти и использование Express.js: Multer
Автономные библиотеки можно использовать вместе с Express.js. В результате, если заголовок этого раздела соответствует вашей ситуации, то у вас, на самом деле, есть три варианта: Formidable, Multer и Multiparty.
Если вы хотите хранить временные данные в памяти, то особого богатства выбора у вас нет. Это поддерживает только Multer.
▍Хранение временных файлов на диске и использование Express.js: Multer или Formidable
Если вам нужно хранить файлы во временной директории, на диске, то у вас есть два варианта: Multer или Formidable. Обе эти библиотеки хорошо зарекомендовали себя на практике, у них имеется большая база пользователей. Если вам нужен контроль над тем, какие поля ввода поддерживают работу с файлами, или если вам нужно, чтобы можно было бы ограничивать количество выгружаемых на сервер файлов, тогда вам стоит остановиться на Multer.
Вот таблица, обобщающая сведения о библиотеках, поддерживающих хранение временных данных в памяти или на диске.
Хранение файлов в памяти | Хранение файлов на диске | |
Express.js используется | Multer | Multer (для обеспечения более полного контроля над механизмами выгрузки файлов)Formidable |
Express.js не используется | Formidable |
Использование Busboy для высоконагруженных продакшн-проектов
Если речь идёт о высоконагруженном проекте, который нуждается в высокой надёжности используемых в нём решений, лучше всего совсем не хранить промежуточные данные на Node.js-сервере. Вместо этого данные соответствующих файлов есть смысл отправлять на отдельный файловый сервер сразу после их получения. То, что мы назвали «файловым сервером», может быть представлено чем-то вроде облачного хранилища, наподобие AWS S3, или базой данных, поддерживающей хранение BLOB-объектов.
Под этот сценарий обработки входящих файлов лучше всего подходит использование потоков. И тут у нас есть два варианта — Busboy и Multiparty. Но, как мы уже знаем, в документации Multiparty рекомендуется для решения подобных задач пользоваться Busboy. Поэтому в данной ситуации сделать выбор крайне просто. Это Busboy.
Итоги
Вот схема, которая позволит вам быстро выбрать именно ту библиотеку для выгрузки файлов на сервер, которая вам нужна.
Получается, что если хранение временных данных в системе вам не нужно — значит — вам стоит взглянуть на Busboy.
Если вас интересует автономная, не зависящая от Express.js, библиотека, поддерживающая хранение временных файлов на диске, то вам нужен пакет Formidable. Он же подойдёт и тем, кого интересует Express.js и хранение временных файлов на диске.
Если вы хотите, чтобы временные данные хранились бы в памяти или на диске, и при этом заинтересованы в использовании Express.js — взгляните на Multer.
Какими библиотеками для обработки данных, выгружаемых на сервер, вы пользуетесь?
Автор: ru_vds