コンテンツにスキップ
use-cases / drag-drop-uploads-into-your-script / hero
PIPE · BROWSER → STDIN

アップロードコードを 1 行も書かずに、スクリプトへドラッグ&ドロップアップロード

hoody-pipe は所有するすべてのパスで既にウェブアップロードフォームを提供しています。ファイルをページにドロップすれば、バイトはパイプを通ってスクリプトの stdin にストリーミングされます。アップロードコードは 1 行も書いていません。

パイプドキュメントを読む

アップロードコードなし、S3 バケットなし、署名付き URL なし

use-cases / drag-drop-uploads-into-your-script / mechanism

ドラッグがストリームになるしくみ

hoody-pipe はパスのルートでウェブ UI を、/noscript で JavaScript 不要のフォールバックを実行します。どちらも同じパスを読んでいる相手にマルチパートのバイトをそのままストリーミングします。スクリプトはパイプを読むだけ — 配線はそれだけです。

browser → pipe → stdin4 ステップ · ハンドラー不要
  • 01

    パスを選び、URL を共有

    https://pipe.hoody.com/upload

    予約されていない任意のパスがパイプになります。その URL がアップロードページです。

  • 02

    ユーザーがブラウザでファイルをドロップ

    GET /upload — 自動配信されるアップロードフォーム

    Hoody がフォームを配信します:ドロップゾーン、マルチパートパーサー、CSP nonce、すべて含まれています。/noscript は制限されたブラウザ向けに用意されています。

  • 03

    バイトがパイプを流れる

    PUT /api/v1/pipe/upload (multipart/form-data)

    最初のマルチパートパートが展開され、レシーバーへストリーミングされます。サーバー側のステージングなし、一時ファイルなし。

  • 04

    スクリプトが stdin を読む

    curl …/api/v1/pipe/upload | python process.py

    レシーバーとセンダーは 5 分の TTL 内に接続されます。スクリプトはウェブページの裏にいることを知らず、ただバイトを読みます。

process.sh
# 1. スクリプトがパイプを読む
$curl https://pipe.hoody.com/api/v1/pipe/upload | python process.py
# 2. 誰かがブラウザで https://pipe.hoody.com/upload を開き、
# invoice-q3.pdf をページにドロップ。
# フォームがバイトを PUT で送信。
# 3. スクリプトが stdin を処理して終了
[OK]/data/uploads/invoice-q3.pdf に保存しました

パイプがアップロードサーバーです。スクリプトがレシーバーです。ドロップゾーンと stdin の間に第 3 のプロセスはありません — Lambda も API ゲートウェイも糊付けの関数もありません。

use-cases / drag-drop-uploads-into-your-script / no-code

書かずに済んだもの

下記の項目はすべて、単発のアップローダーを作るときに普通なら 1 日仕事になるものです。パイプにはそれらすべてが同梱されています。

WEB FORM

ドロップゾーン、ファイルピッカー、進捗表示

パイプ UI はドラッグ&ドロップエリア、クリックして選ぶフォールバック、進捗フィードバックをレンダリングします。/noscript は JS なしのブラウザ向けに純粋な HTML フォームを配信 — 同じパス、追加コードなし。

TRANSPORT

マルチパートのパースとストリーミング

ブラウザが multipart/form-data を POST すると、サーバーは最初のパートを抽出してストリーミングします。ボディのバッファリングなし、一時ファイルのクリーンアップなし、10 行のマルチパートライブラリなし。

SECURITY

CSP nonce、MIME セーフティ、CORS プリフライト

フォームはフレッシュな CSP nonce で配信されます。危険なコンテンツタイプ (text/html、image/svg+xml、application/javascript) は届く前に text/plain に書き換えられます。OPTIONS がクロスオリジンプリフライトを処理します。

CONNECTION

レシーバー先行でもセンダー先行でも、思いのまま

アップロードの前にスクリプトを実行しても、後でも構いません — パイプは両端が揃うまで最大 5 分の TTL で接続を保持します。レシーバー数 (n) は最大 256 まで設定可能です。

use-cases / drag-drop-uploads-into-your-script / compare

これが置き換えるもの

並べて比較:構築するはずだったアップロードパイプライン と、スクリプトに向ける URL。

項目自分で書くものHoody が渡してくれるもの
  • アップロードフォームFlask アプリ + dropzone.js + CSSGET /upload — すでにフォーム
  • マルチパートパースMulter / formidable / busboyワイヤー上で最初のパートを展開
  • ストレージS3 バケット + 署名付き URL エンドポイントスクリプトに直接ストリーミング
  • ルーティングAPI Gateway + Lambda + IAMパスを選べば、それがルート
  • JS 無効時のフォールバックサーバー側でレンダリングした 2 つ目のフォーム/noscript が無料で配信
  • セキュリティヘッダーCSP、nonce、CORS、MIME ガードパイプに同梱
use-cases / drag-drop-uploads-into-your-script / punchline

あなたはスクリプトを書きました。Hoody がアップロードフォームを書きました。

あなたがリリースしたもの

process.py — stdin を読み、仕事をする

while read chunk; do …
HOODY がリリースしたもの

ページ、フォーム、パーサー、セキュリティ

GET /upload — 自動配信
パイプドキュメントを読む
use-cases / drag-drop-uploads-into-your-script / replaces

これが置き換えるもの

単発のファイルアップロードが必要なときに開発者が手を伸ばすパターン。どれもセットアップ税を要求します — バケットのプロビジョニング、ミドルウェアのインストール、署名鍵のローテーション。パイプは URL です。

  • AWS S3 (署名付き URL + バケット)バケットを用意し、URL に署名し、期限切れ管理
  • カスタムルーティングエンドポイントアップロードごとに手作りされ、忘れられるルート
  • Multer / formidable ミドルウェアインストールして面倒を見るマルチパートライブラリ
  • ホステッド型 dropzone サービスサードパーティ SaaS、別請求
  • S3 + Lambda アップロードパイプライン1 つのフォームに 2 つのサービスと IAM の糊付け
  • Filestack / Uploadcareベンダー SDK、ベンダーロックイン、ベンダー価格
use-cases / drag-drop-uploads-into-your-script / cta

パスを選んで、パイプを読みましょう。アップロードフォームはその URL ですでに公開済みです。

パイプルーティングガイドを読む
use-cases / drag-drop-uploads-into-your-script / related

他のユースケースを読む