File Uploads
ShiftAPI supports file uploads via multipart/form-data. Use the form struct tag with *multipart.FileHeader fields.
Basic file upload
Section titled “Basic file upload”type UploadInput struct { File *multipart.FileHeader `form:"file" validate:"required"`}
type UploadResult struct { Filename string `json:"filename"` Size int64 `json:"size"`}
shiftapi.Handle(api, "POST /upload", func(r *http.Request, in UploadInput) (*UploadResult, error) { return &UploadResult{ Filename: in.File.Filename, Size: in.File.Size, }, nil})The TypeScript client automatically uses multipart/form-data content type for this endpoint.
Multiple files
Section titled “Multiple files”Use a slice to accept multiple files:
type MultiUploadInput struct { Files []*multipart.FileHeader `form:"files" validate:"required"`}Restricting file types
Section titled “Restricting file types”Use the accept tag to constrain accepted MIME types:
type ImageUpload struct { Image *multipart.FileHeader `form:"image" accept:"image/png,image/jpeg"`}Upload size limits
Section titled “Upload size limits”The default maximum upload size is 32 MB. Configure it with WithMaxUploadSize:
api := shiftapi.New( shiftapi.WithMaxUploadSize(10 << 20), // 10 MB)Mixed form data and fields
Section titled “Mixed form data and fields”You can combine file uploads with regular form fields:
type ProfileUpdate struct { Name string `form:"name" validate:"required"` Avatar *multipart.FileHeader `form:"avatar"`}