Files
pocket-id-pocket-id/backend/internal/middleware/file_size_limit.go

49 lines
1.1 KiB
Go
Raw Normal View History

2024-08-12 11:00:25 +02:00
package middleware
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/pocket-id/pocket-id/backend/internal/common"
2024-08-12 11:00:25 +02:00
)
type FileSizeLimitMiddleware struct{}
func NewFileSizeLimitMiddleware() *FileSizeLimitMiddleware {
return &FileSizeLimitMiddleware{}
}
func (m *FileSizeLimitMiddleware) Add(maxSize int64) gin.HandlerFunc {
2024-08-12 11:00:25 +02:00
return func(c *gin.Context) {
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, maxSize)
if err := c.Request.ParseMultipartForm(maxSize); err != nil {
2024-10-28 18:11:54 +01:00
err = &common.FileTooLargeError{MaxSize: formatFileSize(maxSize)}
2025-03-27 16:48:36 +01:00
_ = c.Error(err)
c.Abort()
2024-08-12 11:00:25 +02:00
return
}
c.Next()
}
}
// formatFileSize formats a file size in bytes to a human-readable string
func formatFileSize(size int64) string {
const (
KB = 1 << (10 * 1)
MB = 1 << (10 * 2)
GB = 1 << (10 * 3)
)
switch {
case size >= GB:
return fmt.Sprintf("%.2f GB", float64(size)/GB)
case size >= MB:
return fmt.Sprintf("%.2f MB", float64(size)/MB)
case size >= KB:
return fmt.Sprintf("%.2f KB", float64(size)/KB)
default:
return fmt.Sprintf("%d bytes", size)
}
}