RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-04-25上級

Rork アプリで 1GB の動画・写真を確実にアップロードする — TUS と Multipart、バックグラウンド転送の実装ガイド

Rork アプリで 1GB を超える動画や高解像度写真を本番運用で確実にアップロードするための実装ガイド。TUS プロトコル、S3/R2 の Multipart Upload、iOS バックグラウンド転送、再開可能な進捗 UI を動くコードで解説します。

Rork515ファイルアップロードTUSS3 MultipartCloudflare R2バックグラウンド転送2

プレミアム記事

「撮った動画をアップロードしているのに、エレベーターに入った瞬間に進捗バーが最初に戻る」— これを 2 回体験したユーザーは、もうあなたのアプリを開きません。

私は、過去に運営していた写真共有系アプリで同じ問題に直面しました。テストでは素直にアップロードできていた 200MB の動画が、本番では「iPhone を鞄に入れて電車に乗ったユーザー」の環境で 30〜40% の失敗率を叩き出していたのです。原因は単純で、fetch + FormData の素直な一括アップロードは、モバイル環境の前提と真正面からぶつかります。ここではその問題を根本から解決する実装パターンを、動くコード付きでお渡しします。

なぜ「ただの fetch + FormData」では本番で失敗するのか

モバイルアプリのファイルアップロードを「PC のブラウザと同じ感覚」で設計すると、ほぼ確実に以下の壁にぶつかります。

① ネットワークの瞬断が日常的に起こる。電車の駅間、地下街、建物の中、エレベーター、Wi‑Fi からモバイル回線への切り替え — これらの場面では TCP コネクションが切断されます。一括アップロードは切断のたびに最初からやり直しです。1GB のファイルなら、95% までアップロードしてから切れたら 950MB が無駄になります。

② iOS はバックグラウンド処理を容赦なく殺す。ユーザーがアプリをスワイプで閉じなくても、ホームに戻って 30 秒経つと、標準的な URLSession ではリクエストが打ち切られます。BGTaskSchedulerNSURLSession.background を使わない限り、「バックグラウンドでアップロード継続中」は幻想です。

③ メモリ制約が厳しい。1GB のファイルを readAsDataURL で読み込むとクラッシュします。React Native / Expo でメモリを測ると、フォアグラウンドで使えるのは機種にもよりますが 800MB〜1.5GB 程度。ファイル全体をメモリに載せる実装は即アウトです。

④ サーバー側にも制限がある。多くの PaaS(Vercel、Cloudflare Workers、Supabase Edge Functions)は、1 リクエストあたりのボディサイズやタイムアウトに上限があります。Cloudflare Workers は 100MB、Vercel Serverless は 4.5MB(標準)、API Gateway 経由の Lambda は 10MB。一括 POST では届きません。

この 4 つを同時に解決する設計が、レジュームアブル(再開可能)+ チャンク分割 + バックグラウンド対応 のアップロード基盤です。

3 つの選択肢を比較する — どれを採用するか

レジュームアブル・チャンク転送を実現する手段は主に 3 つあります。それぞれ得意領域が違うので、アプリの性質に合わせて選択します。

  • TUS プロトコル(tus.io): HTTP ベースのオープン標準。クライアント実装が各言語で揃っており、サーバーも OSS(tusd)や Supabase Storage / Uppy Companion で動かせる。任意のチャンクサイズ、再開、並列は拡張仕様で。一般用途の万能解
  • S3 / R2 Multipart Upload: AWS S3 の公式仕様。Cloudflare R2 や MinIO など S3 互換ストレージで動く。5MB〜5GB のパートを並列アップロード可能で、5TB まで扱える。クラウドストレージに直接入れる前提のアプリ向け
  • Supabase Storage Resumable Upload: Supabase Storage は裏で TUS を採用しており、JS クライアントから数行で使える。Supabase バックエンドを使っているなら最短

私の採用基準はシンプルです。Cloudflare R2 をストレージに使っているなら Multipart Upload 一択Supabase を使っているなら Supabase Storage Resumable自前の API サーバーに入れる必要があれば TUS — 迷ったらこの順番で決まります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
1GB の動画アップロードが途中で失敗していた読者が、ネットワーク切断やアプリ終了をまたいで再開できる転送基盤を手に入れられる
TUS プロトコル、S3 Multipart Upload、Cloudflare R2 の使い分け判断と、それぞれの本番実装コードを習得できる
バックグラウンドアップロードと進捗 UI を組み合わせ、ユーザーがアプリを閉じてもそのまま完了する UX を実装できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-17
許可を聞かずに通知を届ける — Rork アプリの provisional 認可と、Expo の定番コードが握りつぶすもの
iOS には許可ダイアログを出さずに通知を配り始める provisional 認可があります。ところが Expo 公式が載せている定番の登録コードをそのまま使うと、provisional で通った端末が「拒否」として扱われ、避けたかったはずのダイアログが出ます。granted が false になる仕組みから、5値で許可状態を扱うフック、静かな配信を前提にした通知設計、昇格を求める判断、計測の分離までを実装込みで整理しました。
開発ツール2026-07-17
半年ぶりのアップデートで署名が切れていた — Rork アプリの証明書とプロファイルを機械的に見張る
Apple の署名アセットは静かに期限を迎えます。App Store Connect API で証明書とプロファイルの残日数を機械的に棚卸しし、Cloudflare Workers の定期実行で先回りする設計をまとめました。
開発ツール2026-07-17
Rork の App Store 提出が「輸出コンプライアンス」で毎回止まるのを設定1行で終わらせる
Rork と Rork Max のビルドを App Store Connect に上げるたびに出る Missing Compliance 警告。免除の判断基準と、app.json / Info.plist で恒久的に消す設定、消えない場合の原因を整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →