83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 |