first commit

This commit is contained in:
2025-03-21 11:05:42 +08:00
commit 7dffc94035
1717 changed files with 724764 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
package tencentoss
import (
"bytes"
"context"
"errors"
"fmt"
"io"
"io/fs"
"mime/multipart"
"net/http"
"net/url"
"os"
"path"
"management/internal/config"
fileutil "management/internal/pkg/file"
"github.com/h2non/filetype"
"github.com/tencentyun/cos-go-sdk-v5"
)
var engine *cos.Client
func Init() error {
u, err := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", config.File.TencentUpload.Bucket, config.File.TencentUpload.Region))
if err != nil {
return err
}
b := &cos.BaseURL{BucketURL: u}
engine = cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
// 通过环境变量获取密钥
// 环境变量 SECRETID 表示用户的 SecretId登录访问管理控制台查看密钥https://console.cloud.tencent.com/cam/capi
SecretID: config.File.TencentUpload.AccessKeyID, // 用户的 SecretId建议使用子账号密钥授权遵循最小权限指引降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
// 环境变量 SECRETKEY 表示用户的 SecretKey登录访问管理控制台查看密钥https://console.cloud.tencent.com/cam/capi
SecretKey: config.File.TencentUpload.AccessKeySecret, // 用户的 SecretKey建议使用子账号密钥授权遵循最小权限指引降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
},
})
return nil
}
func UploadFile(ctx context.Context, file *multipart.FileHeader, t fileutil.FileType) (string, error) {
if file.Size > config.File.TencentUpload.AllowFileMaxSize {
return "", errors.New("failed to receive file too large")
}
fileOpen, err := file.Open()
if err != nil {
return "", errors.New("failed to file open")
}
defer func(fileOpen multipart.File) {
_ = fileOpen.Close()
}(fileOpen)
fileBytes, err := io.ReadAll(fileOpen)
if err != nil {
return "", errors.New("failed to read file")
}
if t == fileutil.IMG {
// 判断是不是图片
if !filetype.IsImage(fileBytes) {
return "", fileutil.ErrUnsupported
}
}
kind, err := filetype.Match(fileBytes)
if err != nil || kind == filetype.Unknown {
return "", errors.New("failed to get file type")
}
filename := fileutil.GenFilename(kind.Extension)
imgPath := path.Join(fileutil.GetPath(), filename)
_, err = engine.Object.Put(ctx, imgPath, bytes.NewReader(fileBytes), nil)
if err != nil {
return "", err
}
return imgPath, nil
}
func UploadFileOther(ctx context.Context, p string, t fileutil.FileType) (string, error) {
file, err := os.Open(p)
if err != nil {
return "", err
}
defer func(file *os.File) {
_ = file.Close()
}(file)
fileBytes, err := io.ReadAll(file)
if err != nil {
return "", errors.New("failed to read file")
}
if t == fileutil.IMG {
// 判断是不是图片
if !filetype.IsImage(fileBytes) {
return "", fileutil.ErrUnsupported
}
}
kind, err := filetype.Match(fileBytes)
if err != nil || kind == filetype.Unknown {
return "", errors.New("failed to get file type")
}
filename := fileutil.GenFilename(kind.Extension)
imgPath := path.Join(fileutil.GetPath(), filename)
_, err = engine.Object.Put(ctx, imgPath, bytes.NewReader(fileBytes), nil)
if err != nil {
return "", err
}
return imgPath, nil
}
func UploadFileByFS(ctx context.Context, file fs.File, t fileutil.FileType) (string, error) {
fileBytes, err := io.ReadAll(file)
if err != nil {
return "", errors.New("failed to read file")
}
if t == fileutil.IMG {
// 判断是不是图片
if !filetype.IsImage(fileBytes) {
return "", fileutil.ErrUnsupported
}
}
kind, err := filetype.Match(fileBytes)
if err != nil || kind == filetype.Unknown {
return "", errors.New("failed to get file type")
}
filename := fileutil.GenFilename(kind.Extension)
imgPath := path.Join(fileutil.GetPath(), filename)
_, err = engine.Object.Put(ctx, imgPath, bytes.NewReader(fileBytes), nil)
if err != nil {
return "", err
}
return imgPath, nil
}
func DownloadFile(ctx context.Context, name string) ([]byte, error) {
resp, err := engine.Object.Get(ctx, name, nil)
if err != nil {
return nil, err
}
defer resp.Body.Close()
bs, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return bs, nil
}