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 }