67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package upload
|
||
|
||
import (
|
||
"context"
|
||
"net/http"
|
||
"server/internal/model"
|
||
"server/internal/service"
|
||
"server/utility/ecode"
|
||
"server/utility/oss"
|
||
|
||
"github.com/gogf/gf/v2/errors/gerror"
|
||
)
|
||
|
||
type sUpload struct{}
|
||
|
||
func New() service.IUpload {
|
||
return &sUpload{}
|
||
}
|
||
func init() {
|
||
service.RegisterUpload(New())
|
||
}
|
||
func (s *sUpload) UploadImage(ctx context.Context, in *model.UploadImageIn) (*model.UploadImageOut, error) {
|
||
if in.File == nil {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_file_required").Code())
|
||
}
|
||
// 校验文件类型(只允许图片)
|
||
contentType := in.File.Header.Get("Content-Type")
|
||
if contentType == "" {
|
||
f, err := in.File.Open()
|
||
if err != nil {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_read_failed").Code())
|
||
}
|
||
defer f.Close()
|
||
buf := make([]byte, 512)
|
||
_, err = f.Read(buf)
|
||
if err != nil {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_read_failed").Code())
|
||
}
|
||
contentType = http.DetectContentType(buf)
|
||
}
|
||
if len(contentType) < 6 || contentType[:6] != "image/" {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_type_invalid").Code())
|
||
}
|
||
allowedTypes := map[string]bool{
|
||
"image/jpeg": true,
|
||
"image/png": true,
|
||
"image/gif": true,
|
||
"image/webp": true,
|
||
}
|
||
if !allowedTypes[contentType] {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_format_invalid").Code())
|
||
}
|
||
// 校验文件大小(不超过1MB)
|
||
if in.File.Size > 1*1024*1024 {
|
||
return nil, gerror.NewCode(ecode.Fail.Sub("image_size_exceeded").Code())
|
||
}
|
||
client := oss.GetOSSClient("amazon_s3")
|
||
if client == nil {
|
||
return nil, gerror.NewCode(ecode.Fail.Code())
|
||
}
|
||
url, err := client.Upload(in.File, in.Type)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &model.UploadImageOut{ImageUrl: url}, nil
|
||
}
|