ファイルアップロード

ローカルファイルを FFHub が読める公開 URL に変換。

FFHub のワーカーはクラウド上で動作し、公開 URL のみを入力として受け付けます。ファイルがローカル、スマホ、またはプライベートストレージにある場合は、まず FFHub Storage にアップロードして公開リンクを取得し、それを ffmpeg コマンドに渡してください。

アップロードの仕組み

2 ステップで完了、ファイルは弊社サーバを経由しません。クライアントが使い捨ての署名付き URL を取得して、R2 に直接 PUT します。

  1. 署名。 POST /v1/uploads/sign で 15 分間有効な署名付き URL が返ります。
  2. PUT。 curlfetch、その他任意の HTTP クライアントでその URL にバイトを送ります。

このおかげで、データパスに弊社サーバが入らないまま、最大 5 GB までアップロードできます。

ステップ 1 — 署名付き URL を取得

curl -X POST https://api.ffhub.io/v1/uploads/sign \
  -H "Authorization: Bearer $FFHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "input.mp4",
    "size": 12345678,
    "content_type": "video/mp4"
  }'

レスポンス:

{
  "upload_url": "https://...r2.cloudflarestorage.com/...?X-Amz-Signature=...",
  "public_url": "https://storage.ffhub.io/tmp/uploads/<user>/<rand>.mp4",
  "key": "tmp/uploads/<user>/<rand>.mp4",
  "content_type": "video/mp4",
  "expires_at": "2026-05-12T05:30:00Z"
}

ステップ 2 — ファイルをアップロード

curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  --data-binary "@./input.mp4"

Content-Type ヘッダはステップ 1 で送った content_type完全に一致させてください — そうでないと R2 が署名を弾きます。

PUT が 200/204 を返した瞬間から、ステップ 1 の public_url はそのまま読み取り可能になります。

エンドツーエンドの例

FILE=./input.mp4
SIZE=$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE")

# 1. 署名取得
SIGNED=$(curl -s -X POST https://api.ffhub.io/v1/uploads/sign \
  -H "Authorization: Bearer $FFHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"filename\":\"input.mp4\",\"size\":$SIZE,\"content_type\":\"video/mp4\"}")

UPLOAD_URL=$(echo "$SIGNED" | jq -r '.upload_url')
PUBLIC_URL=$(echo "$SIGNED" | jq -r '.public_url')

# 2. R2 へ直接アップロード
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  --data-binary "@$FILE"

# 3. public_url を入力にタスクを投入
curl -X POST https://api.ffhub.io/v1/tasks \
  -H "Authorization: Bearer $FFHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"command\":\"-i $PUBLIC_URL -c:v libx264 -crf 28 output.mp4\"}"

CLI ならこの流れを自動で処理します — CLI を参照。

制限

  • 最大サイズ:1 アップロードあたり 5 GB(R2 単発 PUT の上限)
  • 署名 URL の有効期間expires_at から 15 分、過ぎたら再署名
  • ファイル保持期間:7 日、その後 R2 から削除

7 日以上保持したい場合は、タスク完了後すぐに自分のバケットにコピーしてください。

すでに公開 URL がある場合は?

このフローはまるごと不要です。タスク API は -i 入力に任意の公開 URL を受け付けます:

curl -X POST https://api.ffhub.io/v1/tasks \
  -H "Authorization: Bearer $FFHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"command":"-i https://example.com/clip.mp4 -c:v libx264 output.mp4"}'

自前の S3、自前の CDN、弊社のストレージ — どれも同じ扱いです。タスクモジュールはバイトの所在を気にしません。

ファイルアップロード — FFHub Docs