64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package validators
 | |
| 
 | |
| import (
 | |
| 	"encoding/binary"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/gabriel-vasile/mimetype"
 | |
| 	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
 | |
| 		}
 | |
| 
 | |
| 		if binary.Size(v.Bytes()) > maxBytes {
 | |
| 			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.")
 | |
| 		}
 | |
| 
 | |
| 		filetype := mimetype.Detect(v.Bytes())
 | |
| 
 | |
| 		for _, t := range validTypes {
 | |
| 			if filetype.Is(t) {
 | |
| 				return nil // valid
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return validation.NewError("validation_invalid_mime_type", fmt.Sprintf(
 | |
| 			"The following mime types are only allowed: %s.",
 | |
| 			strings.Join(validTypes, ","),
 | |
| 		))
 | |
| 	}
 | |
| }
 |