🎨 新增打包docker相关配置
This commit is contained in:
157
utils/upload/local_upload.go
Normal file
157
utils/upload/local_upload.go
Normal file
@@ -0,0 +1,157 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user