package aliyunoss import ( "bytes" "errors" "fmt" "io" "mime/multipart" "time" "management/internal/config" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/h2non/filetype" gonanoid "github.com/matoous/go-nanoid/v2" ) var engine *oss.Client var AllowImageMaxSize int64 = 10485760 func Init() error { var err error engine, err = oss.New(config.File.AliyunUpload.Endpoint, config.File.AliyunUpload.AccessKeyID, config.File.AliyunUpload.AccessKeySecret, oss.Timeout(10, 120)) if err != nil { return err } return err } func UploadImage(file *multipart.FileHeader) (string, error) { if file.Size > AllowImageMaxSize { return "", errors.New("failed to receive image too large") } fileOpen, err := file.Open() if err != nil { return "", errors.New("failed to image open") } defer func(fileOpen multipart.File) { _ = fileOpen.Close() }(fileOpen) fileBytes, err := io.ReadAll(fileOpen) if err != nil { return "", errors.New("failed to read image") } if !filetype.IsImage(fileBytes) { return "", errors.New("failed to no image type") } kind, err := filetype.Match(fileBytes) if err != nil || kind == filetype.Unknown { return "", errors.New("failed to get image type") } imgPath := GenerateFilename(kind.Extension) err = PutObject(imgPath, fileBytes) if err != nil { return "", err } return imgPath, nil } func GenerateFilename(extension string) string { id, _ := gonanoid.New() return fmt.Sprintf("upload/%s/%s/%s/%s.%s", time.Now().Format("2006"), time.Now().Format("01"), time.Now().Format("02"), id, extension) } func PutObject(path string, stream []byte) error { bucket, err := engine.Bucket(config.File.AliyunUpload.Bucket) if err != nil { return errors.New("failed to get bucket") } err = bucket.PutObject(path, bytes.NewReader(stream)) if err != nil { return errors.New("failed to upload to oss") } return nil }