Краткий ответ
То, что получил провайдер, было не изображением, а ответом с ошибкой от вашего сервера. Ссылка, которая открывается в браузере, доказывает лишь то, что работает скачивание в одном браузере. Это не доказывает, что серверы провайдера могут его получить. Типичная ошибка возвращается с кодом 400 в момент отправки, и задача не создается:received: "" означает, что провайдер не смог обнаружить формат изображения в том, что он скачал.
Самое простое решение: разместите изображение в обычном бакете объектного хранилища или CDN и передайте прямой публичный URL, например https://cdn.example.com/xxx.png.
Реальный пример
Ссылка на изображение первого кадра у одного из клиентов выглядела следующим образом:
Последняя строка показывает, что с изображением и параметрами запроса всё было в порядке. Проблема заключалась исключительно в ссылке.
Почему существуют такие ссылки
Это не адрес изображения. Это эндпоинт приложения: приватные файлы пользователей хранятся на бэкенде, и всякий раз, когда файл требуется, приложение выдает временное разрешение на скачивание, содержащее срок действия, подпись и ограничение по количеству скачиваний. Это распространенный способ защиты приватных файлов. Утекшая ссылка быстро перестает работать и становится недействительной после нескольких использований, а каждое скачивание можно отследить через аудит. Такая логика предполагает, что один пользователь скачивает файл один раз в браузере. Она дает сбой, когда файл вместо этого запрашивает сервер:- Отсутствие поддержки Range: многие сервисы получают медиафайлы, сначала запрашивая начальные байты с заголовком
Rangeдля определения формата или скачивая данные частями. Подобные эндпоинты возвращают только файл целиком и отвечают ошибкой на запрос Range - Лимит на скачивание: когда провайдер загружает медиафайл, он может выполнять проверку, скачивать файл и повторять попытки при сбое, поэтому скачивание не обязательно происходит всего один раз. Как только лимит исчерпан, в ответ возвращается JSON с ошибкой
- Короткий срок действия: после истечения срока действия ссылки в ответе также возвращается не изображение
Выбор способа передачи изображения
Если ваши файлы находятся за эндпоинтом такого типа (с выдачей разрешения на скачивание), перед отправкой сформируйте другую ссылку:
- Если файл уже находится в объектном хранилище (OSS, S3, R2 и т. д.), сгенерируйте presigned URL в сервисе хранилища и установите срок его действия не менее 1 часа. Presigned URL истекают только по времени, не имеют лимита на скачивание и поддерживают Range
- В противном случае скопируйте изображение в публичный бакет объектного хранилища или CDN и передайте новый URL в Seedance
Проверка ссылки перед отправкой
Выполните эти две команды на любой машине с доступом в интернет. Замените<URL> на вашу ссылку на изображение и оставьте её в одинарных кавычках, чтобы командная оболочка не интерпретировала &:
- Обе команды возвращают изображение, а не JSON или HTML
- Повторные скачивания продолжают работать без ограничения на количество загрузок
- Не требуются cookie, сессия авторизации или дополнительные заголовки
- Ссылка остается действительной как минимум до завершения отправки, в идеале — в течение 1 часа или более
- Ссылка доступна из публичного интернета, а не находится внутри интранета или за списком разрешенных IP
Связанная документация
API генерации видео
Три способа передачи изображений и все параметры запроса
Рабочий процесс Asset-First
Сравнение трех методов на этапе отправки и загрузка ассетов