62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
package uploader
|
|
|
|
import (
|
|
"bbs-go/internal/pkg/bbsurls"
|
|
"bytes"
|
|
"log/slog"
|
|
"sync"
|
|
|
|
"github.com/mlogclub/simple/common/strs"
|
|
|
|
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
|
|
|
"bbs-go/internal/pkg/config"
|
|
)
|
|
|
|
// 阿里云oss
|
|
type aliyunOssUploader struct {
|
|
once sync.Once
|
|
bucket *oss.Bucket
|
|
}
|
|
|
|
func (aliyun *aliyunOssUploader) PutImage(data []byte, contentType string) (string, error) {
|
|
if strs.IsBlank(contentType) {
|
|
contentType = "image/jpeg"
|
|
}
|
|
key := generateImageKey(data, contentType)
|
|
return aliyun.PutObject(key, data, contentType)
|
|
}
|
|
|
|
func (aliyun *aliyunOssUploader) PutObject(key string, data []byte, contentType string) (string, error) {
|
|
bucket := aliyun.getBucket()
|
|
var options []oss.Option
|
|
if strs.IsNotBlank(contentType) {
|
|
options = append(options, oss.ContentType(contentType))
|
|
}
|
|
if err := bucket.PutObject(key, bytes.NewReader(data), options...); err != nil {
|
|
return "", err
|
|
}
|
|
c := config.Instance.Uploader.AliyunOss
|
|
return bbsurls.UrlJoin(c.Host, key), nil
|
|
}
|
|
|
|
func (aliyun *aliyunOssUploader) CopyImage(originUrl string) (string, error) {
|
|
data, contentType, err := download(originUrl)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return aliyun.PutImage(data, contentType)
|
|
}
|
|
|
|
func (aliyun *aliyunOssUploader) getBucket() *oss.Bucket {
|
|
aliyun.once.Do(func() {
|
|
c := config.Instance.Uploader.AliyunOss
|
|
if client, err := oss.New(c.Endpoint, c.AccessId, c.AccessSecret); err != nil {
|
|
slog.Error(err.Error(), slog.Any("err", err))
|
|
} else if aliyun.bucket, err = client.Bucket(c.Bucket); err != nil {
|
|
slog.Error(err.Error(), slog.Any("err", err))
|
|
}
|
|
})
|
|
return aliyun.bucket
|
|
}
|