署名付きURL 発行#

ID#

api001-upload

エンドポイント#

メソッドパス
POST/images/presigned-url

概要#

S3アップロード用の署名付きURLを発行する。

リクエスト#

ボディ#

物理名論理名必須説明
fileNameファイル名stringアップロードするファイル名
fileSizeファイルサイズnumberファイルサイズ(バイト単位)
contentTypeContent-TypestringMIMEタイプ
{
  "fileName": "string",
  "fileSize": "number",
  "contentType": "string"
}

バリデーション#

検証項目条件レスポンスメッセージ備考
ファイルサイズ5MB 超400 Bad RequestMSG-API-001
Content-Type許可リスト外400 Bad RequestMSG-API-002許可 Content-Type: image/jpeg image/png image/gif image/webp
アップロード枚数上限同一ユーザーが 5 枚以上保持409 ConflictMSG-API-003
レート制限同一 IP から 1 分間に 10 回超429 Too Many RequestsMSG-API-C001共通仕様に準拠

Presigned URL 有効期限#

発行から 300 秒(5 分) 以内に PUT が完了しない場合 URL は無効となる。期限切れ時はクライアントが発行から再試行する。

レスポンス#

200 OK#

物理名論理名必須説明
uploadUrlアップロードURLstringS3への署名付きURL
keyオブジェクトキーstringS3オブジェクトのキー
{
  "uploadUrl": "string",
  "key": "string"
}

ステータスコード#

コード説明
200成功
400バリデーションエラー(サイズ超過・形式不備)
409アップロード枚数上限超過
429レート制限超過

内部処理シーケンス#

sequenceDiagram
    autonumber
    actor User
    participant Hono as Hono Middleware
    participant Domain as Domain Service
    participant DB as Repository
    participant S3 as S3 Client

    User->>+Hono: リクエスト
    Hono->>+Domain: 発行リクエスト
    Domain->>+DB: 現在のアップロード済み数を確認
    DB-->>-Domain: count
    alt count >= 5
        Domain-->>-Hono: Error (409 Conflict)
    else count < 5
        Domain->>+Domain: バリデーション(ファイルサイズ5MB超、Content-Type許可リスト外)
        Domain->>+S3: 署名付きURL取得
        S3-->>-Domain: 署名付きURL
        Domain-->>-Hono: 成功
    end
    Hono-->>-User: 200OK

懸案事項#

ユーザーごとの絞り込み#

  • 現状: DBクエリにユーザーID条件が含まれていない
  • 影響: 全ユーザーの画像が混在して表示・管理される
  • 対応方針: 認証機構と連携し、ログインユーザーの画像のみに絞り込む

画像の削除機能#

  • 現状: 削除用APIが未定義
  • 影響: ユーザーが不要な画像を削除できない
  • 対応方針: 削除用API(api005-delete)を新規設計する

TBD#

画像管理機能拡張#

  • 画像のメタデータ拡張(タグ、説明文など)
  • 画像の公開・非公開設定

パフォーマンス最適化#

  • S3署名付きURLのキャッシュ戦略