Skip to content

File Uploads

ShiftAPI supports file uploads via multipart/form-data. Use the form struct tag with *multipart.FileHeader fields.

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.

Use a slice to accept multiple files:

type MultiUploadInput struct {
Files []*multipart.FileHeader `form:"files" validate:"required"`
}

Use the accept tag to constrain accepted MIME types:

type ImageUpload struct {
Image *multipart.FileHeader `form:"image" accept:"image/png,image/jpeg"`
}

The default maximum upload size is 32 MB. Configure it with WithMaxUploadSize:

api := shiftapi.New(
shiftapi.WithMaxUploadSize(10 << 20), // 10 MB
)

You can combine file uploads with regular form fields:

type ProfileUpdate struct {
Name string `form:"name" validate:"required"`
Avatar *multipart.FileHeader `form:"avatar"`
}