pocketbase/forms/validators/file.go

72 lines
1.9 KiB
Go
Raw Normal View History

2022-07-07 05:19:05 +08:00
package validators
import (
"fmt"
"strings"
2022-08-26 12:00:22 +08:00
"github.com/gabriel-vasile/mimetype"
2022-07-07 05:19:05 +08:00
validation "github.com/go-ozzo/ozzo-validation/v4"
"github.com/pocketbase/pocketbase/tools/rest"
)
// UploadedFileSize checks whether the validated `rest.UploadedFile`
// size is no more than the provided maxBytes.
//
// Example:
// validation.Field(&form.File, validation.By(validators.UploadedFileSize(1000)))
func UploadedFileSize(maxBytes int) validation.RuleFunc {
return func(value any) error {
v, _ := value.(*rest.UploadedFile)
if v == nil {
return nil // nothing to validate
}
2022-10-30 16:28:14 +08:00
if int(v.Header().Size) > maxBytes {
2022-07-07 05:19:05 +08:00
return validation.NewError("validation_file_size_limit", fmt.Sprintf("Maximum allowed file size is %v bytes.", maxBytes))
}
return nil
}
}
// UploadedFileMimeType checks whether the validated `rest.UploadedFile`
// mimetype is within the provided allowed mime types.
//
// Example:
// validMimeTypes := []string{"test/plain","image/jpeg"}
// validation.Field(&form.File, validation.By(validators.UploadedFileMimeType(validMimeTypes)))
func UploadedFileMimeType(validTypes []string) validation.RuleFunc {
return func(value any) error {
v, _ := value.(*rest.UploadedFile)
if v == nil {
return nil // nothing to validate
}
if len(validTypes) == 0 {
return validation.NewError("validation_invalid_mime_type", "Unsupported file type.")
}
2022-10-30 16:28:14 +08:00
f, err := v.Header().Open()
if err != nil {
return validation.NewError("validation_invalid_mime_type", "Unsupported file type.")
}
defer f.Close()
filetype, err := mimetype.DetectReader(f)
if err != nil {
return validation.NewError("validation_invalid_mime_type", "Unsupported file type.")
}
2022-07-07 05:19:05 +08:00
for _, t := range validTypes {
2022-08-26 12:00:22 +08:00
if filetype.Is(t) {
2022-07-07 05:19:05 +08:00
return nil // valid
}
}
return validation.NewError("validation_invalid_mime_type", fmt.Sprintf(
"The following mime types are only allowed: %s.",
strings.Join(validTypes, ","),
))
}
}