Очень хорошей практикой будет реализовать сервер, который примет изображения и будет сам на фронт отправлять их в формат webp
Тут мы так же сохраняем архитектуру классического сервера:
контроллер хранит логику принятия и отправки результатов запросов посредством использования методов из сервиса
сервис же выполняет конкретную логику для выполнения задачи
Данный модуль позволит нам типизировать файлы
Данный модуль позволит нам упростить работу с встроенным в ноду функционалом fs (например, не писать проверки на существование папки)
Данный модуль позволит нам вне зависимости от ОС определять корневую папку корректно
Далее нам нужно будет реализовать функционал для генерации папки с именем дня, чтобы складывать в неё изображения
Первым делом нужно описать тот ответ, который мы должны отправить на клиент. Он будет содержать ссылку до изображения и его имя
src > files > dto > file-element.response.ts
Interceptor - это декторатор в несте, который позволяет перехватить запрос и (например) воспользоваться напрямую функцией для работы с файлами
Конкретно можно обернуть контроллер в @UseInterceptors(), в который вложим FileInterceptor('files') ('files' - это имя мультиплатформы, в которой лежит файл), который уже и предоставит нам возможность работать с методами файлов
Метод uploadFiles будет принимать в себя файлы-изображения и сохранять их на сервере
src > files > files.controller.ts
Далее нам нужно реализовать сервис:
генерируем текущую дату с помощью format
создаём строку папки, которая будет использоваться для генерации папки с изображениями
ensureDir - данная функция обеспечивает создания дирректории (если папка есть, то хорошо, а если нет, то она будет создана)
далее нам нужно будет перебрать полученный массив файлов и записать их все на диск, а так же запушить все пути в массив
src > files > files.service.ts
Далее совершаем запрос с представленными параетрами:
И получаем в ответ массив ссылок на изображения:
Пометка
Данные строки в запросах должны быть равны при отправке файла
002 Конвертация изображений
Данная библиотечка очень оптимальная для использования в оверлоаде, так как она крайне быстро может оптимизировать и выдать нужное нам сконвертированное изображение
Далее мы должны реализовать наш мини-тип, который поможет нам удобнее пользоваться типизацией файлов (внутренним экспрессовским и нашим классом).
Работает это потому, что наши используемые поля из обоих типов пересекаются
src > files > mfile.class.ts
Далее добавляем метод convertToWebP, который будет нам конвертировать изображения в WebP
src > files > files.service.ts
Далее нам нужно положить файлы в массив и проверить, приходит ли нам изображение или нет. Если пришло изображение, то добавляем его в массив с использованием нашей типизации через MFile
src > files > files.controller.ts
Так же у нас на сервере сохраняются изображения (ещё с прошлого урока) в двойном экземпляре
003 Serve файлов
Для сёрва наших файлов на клиент нам потребуется один модуль из неста:
Далее просто импортируем данный модуль и указываем корневую папку, из которой мы сможем получать нужные нам данные
src > files > files.module.ts
И по такому запросу (без api/upload) мы можем получить нужные нам данные
Так же мы можем указать кастомный корень для получения наших изображений (например, если у нас несколько модулей для раздачи файлов)
src > files > files.module.ts
И теперь мы можем по нему получать данные с сервера