Как поставить фото на страницу, когда есть только URL
Страница, которая тянет картинку с чужого сервера, — это страница с чужим трекинг-пикселем.
Почему не принимать просто URL
Потому что поле картинки, принимающее адрес, — это дыра. Направьте его на чужой хост, и браузер каждого посетителя сообщит о себе этому хосту — на сервисе, чья страница о приватности обещает полное отсутствие сторонних запросов. То же поле утекло бы неэкранированным в CSS-фон, а это отдельный класс проблем.
Поэтому поля картинок принимают ровно одну форму: ключ хранилища, выданный нашим же роутом загрузки. Чтобы его получить, отправьте адрес на эндпоинт загрузки в JSON с видом avatar, background или card. Сервер скачает файл, проверит, перекодирует и вернёт ключ, который вы сохраните в страницу, как любое другое поле.
- Загрузка по URL, получение ключа, патч страницы этим ключом. Три шага — или один, если передать адрес фотографии при создании.
- Скачиваются только публичные адреса: всё, что разрешается в приватный или локальный адрес, отклоняется — и до редиректов, и после.
- Ограничения по размеру касаются источника: восемь мегабайт для аватаров и карточек, тридцать для фонов.
- В ответе приходят ещё и вес с размерами после обработки, что удобно, когда нужно отчитаться о сделанном.
Что происходит с байтами
- Всё перекодируется. Файл, который мы отдаём, никогда не равен файлу, который вы прислали.
- EXIF выбрасывается, и это важно: телефонные фотографии несут координаты GPS.
- Размеры и вес ограничиваются по видам, чтобы страница с шестью картинками открывалась на мобильном интернете.
- HEIC с iPhone декодируется на сервере, конвертировать заранее не нужно.
Точки кадрирования и ошибка, которой стоит избежать
Шаблоны режут: круг для фото, во весь экран для фона, полоса для карточки. У каждого поля картинки есть парная точка в процентах, и от неё зависит, лицо в кадре или грудь. При создании точку можно передать вместе с фотографией; потом это ещё одно поле в обновлении, а MCP-инструмент, который ставит фото, принимает её аргументом.
Ошибка, которую стоит назвать: использовать адрес CDN Instagram так, будто он постоянный. Эти URL подписаны и истекают за считаные дни. Переносите байты сразу — ровно это и делает загрузка по URL, — иначе аватар тихо сломается через неделю после передачи страницы.