200
s3
{ "method": "presigned", "uploadUrl": "https://s3-bucket.amazonaws.com/", "fields": { "bucket": "my-s3-bucket", "key": "app-key/avatars/profile-photo-1234567890-abc123.jpg", "X-Amz-Algorithm": "AWS4-HMAC-SHA256", "X-Amz-Credential": "AKIA.../20250905/us-east-2/s3/aws4_request", "X-Amz-Date": "20250905T000000Z", "Policy": "eyJ...", "X-Amz-Signature": "abc123..." }, "key": "profile-photo-1234567890-abc123.jpg", "confirmRequired": true, "confirmUrl": "/api/storage/buckets/avatars/objects/profile-photo-1234567890-abc123.jpg/confirm-upload", "expiresAt": "2025-09-05T01:00:00Z"}
Returns upload strategy based on storage backend (S3 returns presigned URLs, local returns direct upload endpoints)
presigned
direct