Files
lckt-server/utils/upload/local_upload.go
2025-09-17 12:09:35 +08:00

158 lines
3.9 KiB
Go

package upload
// UploadOSS OSS对象存储接口
import (
"errors"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"io/ioutil"
"os"
"strings"
)
type Worker struct {
in chan string
done chan bool
}
type Uploads struct {
}
const endpoint = "oss-cn-hangzhou.aliyuncs.com" // oss endpoint
const accessKeyId = "LTAI5tB3Mn5Y7mVo8h3zkf46" // oss key
const accessKeySecret = "FtuHdFy4NFdVItEiNBnTun3Ddi8BMK" //oss secret
const bucketName = "lckt" //oss bucket名称
const objectName = "avatar/" //oss远程目标地址
const workerCount = 100 //设置最大并发数
const suffix = "" //筛选目录下需要上传的格式
// 上传单个文件
func (u *Uploads) UploadOne(path string) {
// 创建OSSClient实例。
localFileName := path
split := strings.Split(localFileName, `\`)
length := len(split)
fileName := split[length-1 : length]
client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
if err != nil {
handleError(err)
}
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
handleError(err)
}
up(bucket, objectName+fileName[0], localFileName)
}
func createWorker(bucket *oss.Bucket, objectName string, id int) Worker {
w := Worker{
in: make(chan string),
done: make(chan bool),
}
go doWork(id, w.in, w.done, bucket, objectName)
return w
}
// 并发上传目录下所有文件
func (u *Uploads) UploadMany(path string) {
files, err := getAllFiles(path)
if err != nil {
handleError(err)
}
fileCount := len(files)
if fileCount == 0 {
handleError(errors.New("目录下没有指定文件,请重试!"))
}
client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
if err != nil {
handleError(err)
}
bucket, err := client.Bucket(bucketName)
if err != nil {
handleError(err)
}
var workers [workerCount]Worker
for i := 0; i < fileCount; i++ {
workers[i] = createWorker(bucket, objectName, i)
}
for i := 0; i < fileCount; i++ {
workers[i].in <- files[i]
}
for i := 0; i < fileCount; i++ {
<-workers[i].done
}
}
func handleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func up(bucket *oss.Bucket, objectName string, localFileName string) {
// 上传文件。
err := bucket.PutObjectFromFile(objectName, localFileName)
if err != nil {
handleError(err)
}
}
func doWork(id int, c chan string, done chan bool, bucket *oss.Bucket, objectName string) {
for n := range c {
split := strings.Split(n, `\`)
length := len(split)
fileName := split[length-1 : length]
fmt.Printf("worker : %d, object: %s, uploading file %v \n", id, objectName, n)
up(bucket, objectName+fileName[0], n)
go func() { done <- true }()
}
}
// 获取指定目录下的所有文件,包含子目录下的文件
func getAllFiles(dirPth string) (files []string, err error) {
var dirs []string
dir, err := ioutil.ReadDir(dirPth)
if err != nil {
return nil, err
}
PthSep := string(os.PathSeparator)
for _, fi := range dir {
if fi.IsDir() { // 目录, 递归遍历
dirs = append(dirs, dirPth+PthSep+fi.Name())
getAllFiles(dirPth + PthSep + fi.Name())
} else {
// 过滤指定格式
if suffix != "" {
ok := strings.HasSuffix(fi.Name(), suffix)
if ok {
files = append(files, dirPth+PthSep+fi.Name())
}
} else {
files = append(files, dirPth+PthSep+fi.Name())
}
}
}
return files, nil
}
func InitOss() (*oss.Bucket, error) {
// 创建OSSClient实例。
AccessKeyId := "LTAI5tB3Mn5Y7mVo8h3zkf46"
AccessKeySecret := "FtuHdFy4NFdVItEiNBnTun3Ddi8BMK"
Endpoint := "oss-cn-hangzhou.aliyuncs.com"
BucketName := "lckt"
client, err := oss.New(Endpoint, AccessKeyId, AccessKeySecret)
if err != nil {
return nil, err
}
// 获取存储空间。
bucket, err := client.Bucket(BucketName)
if err != nil {
return nil, err
}
return bucket, nil
}