А если на самом деле, то просто быстро накидать от балды, как сказал великий философ: «И так сойдет!». Расскажу как, казалось бы, простая задача на загрузку изображений, сломала мне чуть-чуть мозг...
Технические решения приведенные далее, являются крайне НЕ рекомендованными к использованию, и сделаны, только как временная альтернатива для MVP целей.
Задача:
- Хранить изображения на собственном сервере (для предотвращения кросс-запросов ко множеству сторонних ресурсов).
- Заменять ссылки на изображения (везде), которые ссылаются на сторонние ресурсы.
- Конвертировать изображения в веб формат: WEBP.
- Сжимать изображения под различные размеры.
Казалось бы, сделать сервис с обычным multipart/form-data и дело с концом. Но тогда пришлось бы прикручивать загрузчик к нескольким частям на самом блоге, а конкретно:
- Профиль.
- Заголовок статьи.
- Тело статьи.
И в каждом из этих пунктов нужно было бы доделывать, чуть-чуть, кастомной уникальной логики.
- В первом случае, картинки могут браться со сторонних ресурсов на уровне сервера (авторизация через соц сеть) или загружаться пользователем из настроек.
- Второй пункт, самый простой загрузчик с выбором файла как часть формы.
- А в третьем, нужно прикручивать загрузчик к 3party редактору TinyMCE (уже даже начата работа на будущее).
Но мне нужен был универсальный и простой для интеграции в сам блог, вариант, который будет работать хорошо до тех пор, пока не нужно будет действительно серьезное решение, ибо давайте будем реалистами, кто знает, сколько этот блог протянет, и будет ли он вообще кому-то интересен, так что расширяемся постепенно, а не делаем ВЫСОКОНАГРУЖАЕМЫЕ СЕРВИСЫ С ШИНАМИ И ВСЯКИМИ НОВОМОДНЫМИ ПРИБЛУДАМИ.
И в голову пришла супер простая, и ВРОДЕ даже рабочая идея, схожая по работе с анонимайзером ссылок, вот она (можно нажать, чтобы открыть полное изображение):
Как итог такого решения:
- Просто подменять ссылки, которые вставляются, на ссылки на зеркало, и не важно, сторонние или внутренние (супер просто прикрутить к блогу).
- После первого показа изображения через зеркало, оно уже хранится локально, и даже если пропадает со стороннего ресурса - никуда для нас уже не денется.
- Так как редирект перманентный, он кешится браузером и уже не грузит сервис при последующих запросах.
- Сами статик файлы предоставляются при помощи NGINX, а он хорош в работе с этим.
- На уровне ссылки на зеркало можно контролировать размер.
Из минусов:
- Защиты нет, можно положить весь сервак большим файлом или просто убить все место на жестком диске кучей файлов (очень профессиональное решение).
- Нет обычной загрузки файлов, требуется ссылка на изображение в интернете.
Если поправить минусы выше, вполне можно выкатываться в прод, наверное (ГЫГ).
Как временное решение, очень даже ничего, а самое главное простое, и полностью независимо как микросервис.
Внутреннюю кухню сервиса не вижу смысла рассказывать, а если интересно, можно глянуть в репозитории.