50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
package upload
|
|
|
|
import (
|
|
"RenewCMS/api/pkg/apperr"
|
|
"RenewCMS/internal/domain/image"
|
|
"errors"
|
|
"net/http"
|
|
)
|
|
|
|
const multipartOverheadAllowance = 1 << 20
|
|
|
|
const fileField = "file"
|
|
|
|
func ReadImageInput(w http.ResponseWriter, r *http.Request, uploadedById uint32) (image.ImageInput, func(), bool) {
|
|
r.Body = http.MaxBytesReader(w, r.Body, image.MaxImageSize+multipartOverheadAllowance)
|
|
|
|
file, header, err := r.FormFile(fileField)
|
|
if err != nil {
|
|
var tooLarge *http.MaxBytesError
|
|
if errors.As(err, &tooLarge) {
|
|
http.Error(w, image.ErrImageTooLarge.Error(), http.StatusRequestEntityTooLarge)
|
|
return image.ImageInput{}, nil, false
|
|
}
|
|
http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest)
|
|
return image.ImageInput{}, nil, false
|
|
}
|
|
|
|
input := image.ImageInput{
|
|
Content: file,
|
|
Filename: header.Filename,
|
|
Size: header.Size,
|
|
ContentType: header.Header.Get("Content-Type"),
|
|
UploadedByID: uploadedById,
|
|
}
|
|
return input, func() { _ = file.Close() }, true
|
|
}
|
|
|
|
func WriteCreateError(w http.ResponseWriter, err error) {
|
|
switch {
|
|
case errors.Is(err, image.ErrImageTypeNotAllowed):
|
|
http.Error(w, err.Error(), http.StatusUnsupportedMediaType)
|
|
case errors.Is(err, image.ErrImageTooLarge):
|
|
http.Error(w, err.Error(), http.StatusRequestEntityTooLarge)
|
|
case errors.Is(err, image.ErrImageUnreadable):
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
default:
|
|
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
|
}
|
|
}
|