> This page is for Camera to Cloud.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.frame.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.frame.io/_mcp/server.

# 方法：アップロード（基本）

## はじめに

統合の道のりを進めましょう。Frame.io へのアセットのアップロードについて確認します。このガイドでは、基本的なアップロードプロセスについて順を追って説明します。

## 前提条件

まだの場合は、[C2C の実装：セットアップ](./implementing-c2c-setting-up)ガイドを読んでから先へ進んでください。

[認証および承認プロセス](./implementing-c2c-authentication-and-authorization)中に、`access_token` の取得が必要になります。

このガイドでは、[この Frame.io リンク](https://f.io/Rq1q5CzB)から入手できるサンプルテストアセットを使用します。このファイルをダウンロードし、例に従ってください。サンプルコマンドと同じ値を使用できます。

## 手順 1：アセットを作成する

[サンプルファイルをアップロード](https://f.io/Rq1q5CzB)しましょう。このファイルは 10 秒前に作成されたものとします。まず、Frame.io でアセット参照を作成する必要があります。

```shell
{
curl -X POST https://api.frame.io/v2/devices/assets \
    --header 'Authorization: Bearer [access_token]' \
    --header 'Content-Type: application/json' \
    --header 'x-client-version: 2.0.0' \
    --data-binary @- <<'__JSON__' 
        {
            "name": "C2C_TEST_CLIP.mp4", 
            "filetype": "video/mp4", 
            "filesize": 21136250,
            "offset": 10
        }
__JSON__
} | python -m json.tool
```

<Info title="API エンドポイント仕様">
`/v2/devices/assets` のドキュメントは[こちら](https://developer.frame.io/api/reference/operation/deviceAssetCreate/)に用意されています。レガシーエンドポイント `/v2/assets` は引き続き機能しますが、新しい統合では `/v2/devices/assets` の使用をお勧めします。
</Info>

<Info title="JSON エンコーディング">
以前使用していた認証エンドポイントとは異なり、このエンドポイントは `form/multipart` ではなく `application/json` エンコーディングを受け入れます。また、`application/x-www-form-urlencoded` も受け入れます。
</Info>

<Info title="コマンド構文">
この例では、[heredoc](https://linuxize.com/post/bash-heredoc/) を使用して、JSON ペイロードを読みやすい複数行形式で `curl` に提供しています。`--data-binary@-` パラメーターは `curl` に対し、stdin から生データを読み取るよう指示しています。このアプローチの詳細については、[こちら](https://unix.stackexchange.com/questions/88490/how-do-you-use-output-redirection-in-combination-with-here-documents-and-cat)を参照してください。
</Info>

JSON ペイロードパラメーターを確認しましょう。

`name`：Frame.io に表示されるアセット名。ディスク上のファイル名と一致している必要はありません。

`filetype`：ファイルの [MIME タイプ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)。ほとんどのプログラミング言語には、MIME タイプ検出用のユーティリティが用意されています（例：[Go](https://golangcode.com/get-the-content-type-of-file/)、[Python](https://docs.python.org/3/library/mimetypes.html)）。

`filesize`：ファイルサイズ（バイト単位）。サンプルファイルは約 21.1 MB です。

`offset`：ファイルが作成されてからの秒数。省略した場合はデフォルトで 0 になります。デバイスの一時停止を理由にファイルを拒否するかどうかの判断に役立つことから、このパラメーターは必須です。詳細については、[アップロード（高度）ガイド](./how-to-advanced-uploads)で説明しています。

レスポンスは次のようになります（一部のフィールドは省略されています）。

```json
{
    "_type": "file",
    ...
    "id": "9a280f99-8f4f-46b0-a4b4-ec4c2f95138e",
    ...
    "upload_urls": [
        "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path]",
        "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path]"
    ],
    ...
}
```

この段階では、ファイルをアップロードする意図を Frame.io に通知しているだけで、実際のファイルデータは転送されていません。プロジェクトでデバイスのフォルダーを確認すると、「アップロード中」状態のプレースホルダーアセットが表示されます。

`upload_urls` フィールドには、ファイルチャンクをアップロードする URL が含まれています。このテストファイルに対し、2 つのアップロード URL が返されます。

## 手順 2：ファイルをチャンクに分割する

レスポンスには複数のアップロード URL が含まれていました。Frame.io にアップロードする際にファイルをチャンクに分割して個別にアップロードすることには、次のようなメリットがあります。

* **信頼性の向上**：1 個のチャンクに障害が発生しても、アップロード全体をやり直す必要はありません。
* **アップロードの高速化**：複数のチャンクを並行してアップロードできます（[アップロード（高度）ガイド](./how-to-advanced-uploads)で説明しています）。

最適なチャンクサイズを決定するには、次の式を使用します。

**`Python`**

```python title="Python"
# We use math.ceil() to ensure we get the upper bound in the division
chunk_size = math.ceil(float(file.size) / float(len(response.upload_urls)))
```

このサンプルファイルの場合、計算は次のようになります。

**`Python`**

```python title="Python"
math.ceil(21136250 / 2)
# 10568125
```

つまり、各チャンクは 10,568,125 バイトである必要があります。チャンクサイズは通常、25 MB 前後を目指します。正確な計算については[アップロード（高度）ガイド](./how-to-advanced-uploads)を参照してください。

<Info title="最終チャンクサイズ">
ファイルサイズが均等に分割されることはまれなので、最終チャンクは計算された `chunk_size` よりも小さくなる可能性があります。実装では、ファイルチャンクを読み取る際にこのことを考慮する必要があります。
</Info>

このデモンストレーションでは、[head](https://man7.org/linux/man-pages/man1/head.1.html) および [tail](https://man7.org/linux/man-pages/man1/tail.1.html) コマンドを使用して、ファイルチャンクを抽出します。

## 手順 3：チャンクをアップロードする

最初のチャンクをアップロードするには：

```shell
head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path] \
        --include \
        --header 'content-type: video/mp4' \
        --header 'x-amz-acl: private' \
        --data-binary @-
```

<Info title="コマンド構文">
`--data-binary@-` パラメーターは `curl` に対し、`head` コマンドで取得した stdin からの生データを使用するよう指示します。
</Info>

リクエストに次のヘッダーが必要です。

`content-type`：アセットの作成時に使用されたものと同じ MIME タイプ値

`x-amz-acl`：AWS S3 権限の場合は常に `private` に設定

アップロードが正常に完了すると、次が返されます。

```text
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
...
```

同様に、2 番目のチャンクをアップロードします。

```shell
tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path] \
        --include \
        --header 'content-type: video/mp4' \
        --header 'x-amz-acl: private' \
        --data-binary @-
```

両方のアップロードが完了すると、アセットは Frame.io で再生可能になります。🎉

<Warning title="アップロードエラー">
チャンクのアップロードでは、データが Frame.io の API にではなく AWS S3 に直接送信されます。エラーレスポンスは、標準の Frame.io エラーではなく、AWS S3 形式に従います。S3 エラーの処理については、[エラー処理ガイド](https://developer.frame.io/docs/device-integrations/how-to-handle-errors)で説明します。
</Warning>

<Info title="チャンク順序">
概念的にはチャンクを順番にアップロードするほうがシンプルですが、実際には任意の順序でアップロードできます。システムは、アップロード順に関係なく、正しく再構成します。
</Info>

## まとめ

アップロードプロセス全体を示す簡素化された Python 風擬似コードの例を次に示します。

**`Python`**

```python title="Python"
file = open("~/Downloads/C2C_TEST_CLIP.mp4")
mimetype = mimetypes.for_file("~/Downloads/C2C_TEST_CLIP.mp4")[0]
created_at = time.ctime(file.stat.ST_CTIME)

asset = c2c.asset_create(
    name="C2C_TEST_CLIP.mp4", 
    filetype=mimetype, 
    filesize=file.size,
    offset=datetime.now() - created_at,
    channel=0,
)

chunk_size = math.ceil(float(file.size) / float(len(asset.upload_urls)))

for chunk_url in asset.upload_urls:
   chunk = file.read(bytes=chunk_size)
   c2c.upload_chunk(chunk, chunk_url, mimetype)
```

この例は基本フローであり、エラー処理や並列アップロードはありません。これらについては、[エラー処理](https://developer.frame.io/docs/device-integrations/how-to-handle-errors)と[アップロード（高度）](./how-to-advanced-uploads)のガイドで説明します。

## 次のステップ

最初のアセットが Frame.io に正常にアップロードされました。[アップロード（高度）ガイド](./how-to-advanced-uploads)では、本番対応の実装に向けたより高度な技術と要件について説明します。

不明点がありましたら、当社チームまでお問い合わせください。また、[アップロード（リアルタイム）ガイド](./how-to-upload-realtime)に進んで、アセットの作成時のアップロードについてご確認ください。