Skip to main content

Краткий ответ

То, что получил провайдер, было не изображением, а ответом с ошибкой от вашего сервера. Ссылка, которая открывается в браузере, доказывает лишь то, что работает скачивание в одном браузере. Это не доказывает, что серверы провайдера могут его получить. Типичная ошибка возвращается с кодом 400 в момент отправки, и задача не создается:
received: "" означает, что провайдер не смог обнаружить формат изображения в том, что он скачал. Самое простое решение: разместите изображение в обычном бакете объектного хранилища или CDN и передайте прямой публичный URL, например https://cdn.example.com/xxx.png.

Реальный пример

Ссылка на изображение первого кадра у одного из клиентов выглядела следующим образом:
В браузере изображение отображалось нормально, однако при отправке задачи Seedance возвращалась описанная выше ошибка 400. Мы протестировали ссылку: Последняя строка показывает, что с изображением и параметрами запроса всё было в порядке. Проблема заключалась исключительно в ссылке.

Почему существуют такие ссылки

Это не адрес изображения. Это эндпоинт приложения: приватные файлы пользователей хранятся на бэкенде, и всякий раз, когда файл требуется, приложение выдает временное разрешение на скачивание, содержащее срок действия, подпись и ограничение по количеству скачиваний. Это распространенный способ защиты приватных файлов. Утекшая ссылка быстро перестает работать и становится недействительной после нескольких использований, а каждое скачивание можно отследить через аудит. Такая логика предполагает, что один пользователь скачивает файл один раз в браузере. Она дает сбой, когда файл вместо этого запрашивает сервер:
  • Отсутствие поддержки Range: многие сервисы получают медиафайлы, сначала запрашивая начальные байты с заголовком Range для определения формата или скачивая данные частями. Подобные эндпоинты возвращают только файл целиком и отвечают ошибкой на запрос Range
  • Лимит на скачивание: когда провайдер загружает медиафайл, он может выполнять проверку, скачивать файл и повторять попытки при сбое, поэтому скачивание не обязательно происходит всего один раз. Как только лимит исчерпан, в ответ возвращается JSON с ошибкой
  • Короткий срок действия: после истечения срока действия ссылки в ответе также возвращается не изображение
Публичный URL в объектном хранилище или CDN (R2, S3, OSS, TOS и т. д.) лишен подобных ограничений. Он ведет напрямую к статическому файлу, поддерживает Range, не имеет ограничений по скачиванию и не требует дополнительных заголовков или cookie.

Выбор способа передачи изображения

Если ваши файлы находятся за эндпоинтом такого типа (с выдачей разрешения на скачивание), перед отправкой сформируйте другую ссылку:
  • Если файл уже находится в объектном хранилище (OSS, S3, R2 и т. д.), сгенерируйте presigned URL в сервисе хранилища и установите срок его действия не менее 1 часа. Presigned URL истекают только по времени, не имеют лимита на скачивание и поддерживают Range
  • В противном случае скопируйте изображение в публичный бакет объектного хранилища или CDN и передайте новый URL в Seedance

Проверка ссылки перед отправкой

Выполните эти две команды на любой машине с доступом в интернет. Замените <URL> на вашу ссылку на изображение и оставьте её в одинарных кавычках, чтобы командная оболочка не интерпретировала &:
Также убедитесь, что:
  • Обе команды возвращают изображение, а не JSON или HTML
  • Повторные скачивания продолжают работать без ограничения на количество загрузок
  • Не требуются cookie, сессия авторизации или дополнительные заголовки
  • Ссылка остается действительной как минимум до завершения отправки, в идеале — в течение 1 часа или более
  • Ссылка доступна из публичного интернета, а не находится внутри интранета или за списком разрешенных IP
Проверка ссылки с ограничением на скачивание также расходует доступные загрузки. Выполняйте проверку с отдельно созданной ссылкой, чтобы не исчерпать ту, которую вы планируете отправить.

Связанная документация

API генерации видео

Три способа передачи изображений и все параметры запроса

Рабочий процесс Asset-First

Сравнение трех методов на этапе отправки и загрузка ассетов