> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedanceで「invalid image format」と表示されるが、ブラウザではリンクが開ける

> Seedanceの画像リンクはブラウザでは問題なく開けるものの、タスク送信時に400 invalid image formatが返されます。そのリンクはサーバー側での取得用ではなく、ブラウザでの1回限りのダウンロード向けに作成されており、Rangeリクエストの拒否、ダウンロード回数の制限、または有効期限が早すぎることが原因です。本ページでは、リンクの確認方法と、公開URL、アセットID、Base64の選び方について説明します。

## 簡潔な回答

プロバイダーが受信したのは画像ではなく、サーバーからのエラーレスポンスでした。ブラウザで開けるリンクは、**あるブラウザでのダウンロード**が機能することを証明しているに過ぎません。**プロバイダーのサーバーがそれを取得できること**を証明するものではありません。

典型的なエラーはリクエスト送信時に400として返され、タスクは作成されません：

```text theme={null}
The parameter `content[1]` specified in the request is not valid:
invalid image format (detected format); received: "".
```

`received: ""` は、プロバイダーがダウンロードした内容から画像フォーマットを検出できなかったことを意味します。

**最もシンプルな解決策**：画像を通常のオブジェクトストレージバケットまたはCDNでホストし、`https://cdn.example.com/xxx.png` などのシンプルなパブリックURLを渡すことです。

## 実際の事例

あるお客様のファーストフレーム画像のリンクは以下のようになっていました：

```text theme={null}
https://<customer-domain>/api/v1/resource-download-grants/<file-id>/content?access_token=<signed token with an expiry>
```

ブラウザでは画像が正常に表示されましたが、Seedanceタスクを送信すると上記の400が返されました。このリンクをテストした結果は以下の通りです：

| テスト                               | 結果                          |
| --------------------------------- | --------------------------- |
| 通常のGET（ブラウザと同様）                   | 200、PNG画像が返される              |
| `Range`ヘッダーを付与し、ファイルの先頭部分を要求するGET | **416**、画像の代わりにJSONエラーが返される |
| 連続で約10回ダウンロードした後                  | **429**、ダウンロード権限が枯渇         |
| 同じ画像をBase64として送信                  | **成功**し、動画が生成された            |

最後の行が示しているように、画像とリクエストパラメータには問題がなく、リンクのみに問題がありました。

## このようなリンクが存在する理由

これは画像のアドレスではありません。**アプリケーションエンドポイント**です。ユーザーのプライベートファイルはバックエンドに保存されており、ファイルが必要になるたびに、アプリは有効期限、署名、ダウンロード回数制限を含む一時的なダウンロード許可を発行します。これはプライベートファイルを保護するための一般的な方法です。リンクが漏洩しても短時間かつ数回の使用で使用できなくなり、すべてのダウンロードを監査することができます。

この設計は、**1人のユーザーがブラウザで1回ダウンロードすること**を想定しています。そのため、サーバーが代わりにファイルを取得しようとすると破綻します。

* **Range 非対応**: 多くのサービスでは、フォーマットを検出するためにまず `Range` ヘッダーで先頭のバイトをリクエストしたり、チャンク単位でダウンロードしたりしてメディアを取得します。このようなエンドポイントはファイル全体しか返さず、Range リクエストに対してエラーを返します
* **ダウンロード回数の上限**: プロバイダーがメディアを取得する際、プローブ、ダウンロード、失敗時の再試行を行う可能性があり、必ずしも1回だけのダウンロードとは限りません。上限に達すると、レスポンスはエラーの JSON になります
* **短い有効期限**: リンクが期限切れになると、レスポンスは画像ではなくなります

オブジェクトストレージや CDN（R2、S3、OSS、TOS など）上の公開 URL には、このような制限は一切ありません。静的ファイルを直接指し示し、Range をサポートし、ダウンロード制限もなく、追加のヘッダーや Cookie も不要です。

## 画像の渡し方の選択

| 方法                                     | 使用する場面                               | 備考                                                                                                                               |
| -------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| **公開URL**（推奨）                          | 1回のみ使用する画像                           | リクエストボディが非常に小さくなります。プロバイダーのサーバーがファイルを直接取得するため、より大きな容量と帯域幅を利用できます。リンクは後述のチェック項目を満たしている必要があります                                     |
| **アセットID** `asset://...`               | 同じ画像を繰り返し参照する場合、またはリアルな人物の顔が含まれている場合 | 一度アップロードすれば、以降は毎回短い文字列を渡すだけで済みます。[アセット優先ワークフロー](/ja/api-capabilities/seedance2/asset-first-workflow) を参照してください                   |
| **Base64** `data:image/png;base64,...` | 適切な公開URLが利用できない場合のフォールバック            | エンコードによりサイズが約3分の1増加し、そのすべてがお使いのマシンからアップロードされるため、送信が著しく遅くなります。あるテストでは、2.3 MBのPNGが3.1 MBのリクエストボディになり、create-task呼び出しの応答に約60秒かかりました |

ファイルがこのようなダウンロード許可エンドポイントの背後にある場合は、送信前に別のリンクを用意してください：

* ファイルがすでにオブジェクトストレージ（OSS、S3、R2など）にある場合は、ストレージサービスから**署名付きURL**を生成し、その有効期限を少なくとも1時間に設定してください。署名付きURLは時間経過によってのみ失効し、ダウンロード回数の上限はなく、Rangeをサポートしています
* それ以外の場合は、画像を公開オブジェクトストレージバケットまたはCDNにコピーし、新しいURLをSeedanceに渡してください

## 送信前のリンク確認

インターネットにアクセス可能な任意のマシンで、これら2つのコマンドを実行してください。`<URL>`を画像リンクに置き換え、シェルが`&`を解釈しないようにシングルクォートで囲んだままにしてください：

```bash theme={null}
# 1. Plain download: expect 200 and an image Content-Type such as image/png or image/jpeg
curl -s -o /dev/null -w 'code=%{http_code} type=%{content_type} size=%{size_download}\n' '<URL>'

# 2. Range download: expect 206 (or 200 with the full image), never a 4xx
curl -s -o /dev/null -w 'code=%{http_code} type=%{content_type}\n' -H 'Range: bytes=0-1023' '<URL>'
```

また、以下の点も確認してください：

* 両方のコマンドがJSONやHTMLではなく画像を返すこと
* ダウンロード回数の上限がなく、繰り返しダウンロードが機能し続けること
* Cookie、ログインセッション、追加のヘッダーが不要であること
* 少なくとも送信が完了するまで、理想的には1時間以上リンクが有効であること
* イントラネット内やIP許可リスト配下ではなく、パブリックインターネットからリンクにアクセスできること

<Warning>
  ダウンロード上限があるリンクを確認する場合もダウンロード回数が消費されます。送信予定のリンクを使い果たさないよう、別途発行したリンクでテストしてください。
</Warning>

## 関連ドキュメント

<CardGroup cols={2}>
  <Card title="動画生成 API" icon="video" href="/ja/api-capabilities/seedance2/video-generation">
    画像を渡す3つの方法とすべてのリクエストパラメータ
  </Card>

  <Card title="アセットファーストワークフロー" icon="gauge" href="/ja/api-capabilities/seedance2/asset-first-workflow">
    3つの方法の送信時の比較とアセットのアップロード方法
  </Card>
</CardGroup>
