79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package http
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/zhashkevych/s3-file-uploader/pkg/uploader"
|
|
)
|
|
|
|
const (
|
|
MAX_UPLOAD_SIZE = 5 << 20 // 5 megabytes
|
|
)
|
|
|
|
var (
|
|
IMAGE_TYPES = map[string]interface{}{
|
|
"image/jpeg": nil,
|
|
"image/png": nil,
|
|
}
|
|
)
|
|
|
|
type Handler struct {
|
|
uploader uploader.Uploader
|
|
}
|
|
|
|
func NewHandler(uploader uploader.Uploader) *Handler {
|
|
return &Handler{
|
|
uploader: uploader,
|
|
}
|
|
}
|
|
|
|
type uploadResponse struct {
|
|
Status string `json:"status"`
|
|
Msg string `json:"message,omitempty"`
|
|
URL string `json:"url,omitempty"`
|
|
}
|
|
|
|
func (h *Handler) Upload(c *gin.Context) {
|
|
// Limit Upload File Size
|
|
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, MAX_UPLOAD_SIZE)
|
|
|
|
file, fileHeader, err := c.Request.FormFile("file")
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
buffer := make([]byte, fileHeader.Size)
|
|
file.Read(buffer)
|
|
fileType := http.DetectContentType(buffer)
|
|
|
|
// Validate File Type
|
|
if _, ex := IMAGE_TYPES[fileType]; !ex {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: "file type is not supported",
|
|
})
|
|
return
|
|
}
|
|
|
|
url, err := h.uploader.Upload(c.Request.Context(), file, fileHeader.Size, fileType)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, &uploadResponse{
|
|
Status: "error",
|
|
Msg: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, &uploadResponse{
|
|
Status: "ok",
|
|
URL: url,
|
|
})
|
|
}
|