Files
xiaoxia-saas/apps/api/app/schemas/chunked_upload.py
T
XiaoXia Bot e44ebc535e
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Waiting to run
CI/CD Pipeline / Validate Code Quality And Tests (push) Has been cancelled
feat: add chunked upload API for large file uploads
- POST /upload/chunk/init - Initialize chunked upload
- POST /upload/chunk/{upload_id}/{chunk_index} - Upload single chunk
- POST /upload/chunk/{upload_id}/complete - Complete upload and merge chunks
- GET /upload/chunk/{upload_id}/status - Get upload status for resume

Features:
- Support files up to 2GB
- Default chunk size: 5MB
- File type whitelist validation
- 24-hour expiration for incomplete uploads
- Automatic cleanup of expired uploads
2026-06-26 20:15:56 +08:00

43 lines
2.0 KiB
Python

from datetime import datetime
from pydantic import BaseModel, Field
class ChunkedUploadInitRequest(BaseModel):
filename: str = Field(..., min_length=1, max_length=255, description="Filename")
file_size: int = Field(..., gt=0, le=2147483648, description="File size in bytes, max 2GB")
total_chunks: int = Field(..., gt=0, description="Total number of chunks")
content_type: str = Field(default="application/octet-stream", min_length=1, max_length=100, description="Content type")
project_id: str = Field(..., min_length=1, description="Project ID")
library_id: str = Field(..., min_length=1, description="Asset library ID")
class ChunkedUploadInitResponse(BaseModel):
upload_id: str = Field(..., description="Upload ID")
chunk_size: int = Field(..., description="Chunk size in bytes")
total_chunks: int = Field(..., description="Total number of chunks")
filename: str = Field(..., description="Filename")
expires_at: datetime = Field(..., description="Expiration time")
class ChunkedUploadStatusResponse(BaseModel):
upload_id: str = Field(..., description="Upload ID")
filename: str = Field(..., description="Filename")
file_size: int = Field(..., description="File size")
total_chunks: int = Field(..., description="Total number of chunks")
uploaded_chunks: list[int] = Field(..., description="List of uploaded chunk indices")
status: str = Field(..., description="Upload status: pending/uploading/completed/failed")
created_at: datetime = Field(..., description="Creation time")
expires_at: datetime = Field(..., description="Expiration time")
class ChunkedUploadCompleteRequest(BaseModel):
project_id: str = Field(..., min_length=1, description="Project ID")
library_id: str = Field(..., min_length=1, description="Asset library ID")
class ChunkedUploadCompleteResponse(BaseModel):
storage_key: str = Field(..., description="Storage key")
ingest_job_id: str = Field(..., description="Ingest job ID")
url: str = Field(..., description="File URL")