first commit
This commit is contained in:
82
internal/service/aliyunoss/aliyunoss.go
Normal file
82
internal/service/aliyunoss/aliyunoss.go
Normal file
@@ -0,0 +1,82 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user