This commit is contained in:
12600k-rog-d4
2025-12-09 20:33:57 +08:00
parent 144ed3cbdf
commit 8f4d399cfd
1498 changed files with 3778 additions and 3654 deletions

View File

@@ -0,0 +1,61 @@
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
}

View File

@@ -0,0 +1,41 @@
package uploader
import (
"bbs-go/internal/pkg/bbsurls"
"io/ioutil"
"os"
"path/filepath"
"bbs-go/internal/pkg/config"
)
// 本地文件系统
type localUploader struct{}
func (local *localUploader) PutImage(data []byte, contentType string) (string, error) {
key := generateImageKey(data, contentType)
return local.PutObject(key, data, contentType)
}
func (local *localUploader) PutObject(key string, data []byte, contentType string) (string, error) {
if err := os.MkdirAll("/", os.ModeDir); err != nil {
return "", err
}
c := config.Instance.Uploader.Local
filename := filepath.Join(c.Path, key)
if err := os.MkdirAll(filepath.Dir(filename), os.ModePerm); err != nil {
return "", err
}
if err := ioutil.WriteFile(filename, data, os.ModePerm); err != nil {
return "", err
}
return bbsurls.UrlJoin(c.Host, key), nil
}
func (local *localUploader) CopyImage(originUrl string) (string, error) {
data, contentType, err := download(originUrl)
if err != nil {
return "", err
}
return local.PutImage(data, contentType)
}

View File

@@ -0,0 +1,64 @@
package uploader
import (
"strings"
"sync"
"github.com/mlogclub/simple/common/strs"
"github.com/mlogclub/simple/common/urls"
"bbs-go/internal/pkg/config"
)
type uploader interface {
PutImage(data []byte, contentType string) (string, error)
PutObject(key string, data []byte, contentType string) (string, error)
CopyImage(originUrl string) (string, error)
}
var (
aliyun = &aliyunOssUploader{
once: sync.Once{},
bucket: nil,
}
local = &localUploader{}
)
func PutImage(data []byte, contentType string) (string, error) {
return getUploader().PutImage(data, contentType)
}
func PutObject(key string, data []byte, contentType string) (string, error) {
return getUploader().PutObject(key, data, contentType)
}
func CopyImage(url string) (string, error) {
u1 := urls.ParseUrl(url).GetURL()
u2 := urls.ParseUrl(config.Instance.BaseUrl).GetURL()
// 本站host不下载
if u1.Host == u2.Host {
return url, nil
}
return getUploader().CopyImage(url)
}
func getUploader() uploader {
if IsEnabledOss() {
return aliyun
} else {
return local
}
}
// IsEnabledOss 是否启用阿里云oss
func IsEnabledOss() bool {
enable := config.Instance.Uploader.Enable
return strs.EqualsIgnoreCase(enable, "aliyun") || strs.EqualsIgnoreCase(enable, "oss") ||
strs.EqualsIgnoreCase(enable, "aliyunOss")
}
// IsOssImageUrl 是否是存放在阿里云oss中的图片
func IsOssImageUrl(url string) bool {
host := urls.ParseUrl(config.Instance.Uploader.AliyunOss.Host).GetURL().Host
return strings.Contains(url, host)
}

View File

@@ -0,0 +1,37 @@
package uploader
import (
"bbs-go/internal/pkg/config"
"mime"
"time"
"github.com/go-resty/resty/v2"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/common/digests"
"github.com/mlogclub/simple/common/strs"
)
// generateKey 生成图片Key
func generateImageKey(data []byte, contentType string) string {
md5 := digests.MD5Bytes(data)
ext := ""
if strs.IsNotBlank(contentType) {
exts, err := mime.ExtensionsByType(contentType)
if err == nil || len(exts) > 0 {
ext = exts[0]
}
}
if config.Instance.IsProd() {
return "images/" + dates.Format(time.Now(), "2006/01/02/") + md5 + ext
} else {
return "test/images/" + dates.Format(time.Now(), "2006/01/02/") + md5 + ext
}
}
func download(url string) ([]byte, string, error) {
rsp, err := resty.New().R().Get(url)
if err != nil {
return nil, "", err
}
return rsp.Body(), rsp.Header().Get("Content-Type"), nil
}