117 lines
2.6 KiB
Go
117 lines
2.6 KiB
Go
![]() |
package oss
|
|||
|
|
|||
|
import (
|
|||
|
_ "catface/bootstrap"
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"github.com/qiniu/go-sdk/v7/storagev2/credentials"
|
|||
|
"github.com/qiniu/go-sdk/v7/storagev2/http_client"
|
|||
|
"github.com/qiniu/go-sdk/v7/storagev2/objects"
|
|||
|
"github.com/qiniu/go-sdk/v7/storagev2/uploader"
|
|||
|
"io"
|
|||
|
"log"
|
|||
|
"os"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// MultiUploadToQiNiu 批量上传文件到七牛云
|
|||
|
// images: 文件列表
|
|||
|
// 返回值: 文件url列表, 错误信息
|
|||
|
func MultiUploadToQiNiu(images []string) ([]string, error) {
|
|||
|
|
|||
|
// 并发上传图片
|
|||
|
errCh := make(chan error, len(images))
|
|||
|
|
|||
|
// 这里初始化而不扩容切片,因为在循环中会对切片进行赋值,扩容会导致切片地址变化
|
|||
|
resImageURLs := make([]string, len(images)) // 保证图片的顺序
|
|||
|
|
|||
|
for idx, image := range images {
|
|||
|
// 闭包捕获循环变量
|
|||
|
go func(index int, img string) {
|
|||
|
// 打开文件
|
|||
|
file, err := os.OpenFile(img, os.O_RDONLY, 0666)
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
errCh <- err
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
defer func(file *os.File) {
|
|||
|
err := file.Close()
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
}
|
|||
|
}(file)
|
|||
|
|
|||
|
imageStr, err := UploadToQiNiu(file)
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
errCh <- err
|
|||
|
return
|
|||
|
}
|
|||
|
resImageURLs[index] = imageStr
|
|||
|
errCh <- nil
|
|||
|
}(idx, image)
|
|||
|
}
|
|||
|
|
|||
|
// 等待所有图片上传完成并检查错误
|
|||
|
for range images {
|
|||
|
if err := <-errCh; err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return resImageURLs, nil
|
|||
|
}
|
|||
|
|
|||
|
// UploadToQiNiu 上传文件到七牛云
|
|||
|
// reader: 文件流
|
|||
|
// 返回值: 文件url, 错误信息
|
|||
|
func UploadToQiNiu(reader io.Reader) (string, error) {
|
|||
|
accessKey := qiNiuAccessKey
|
|||
|
secretKey := qiNiuSecretKey
|
|||
|
bucket := qiNiuBucket
|
|||
|
|
|||
|
mac := credentials.NewCredentials(accessKey, secretKey)
|
|||
|
|
|||
|
key := fmt.Sprintf("img_%d", time.Now().Unix())
|
|||
|
|
|||
|
uploadManager := uploader.NewUploadManager(&uploader.UploadManagerOptions{
|
|||
|
Options: http_client.Options{
|
|||
|
Credentials: mac,
|
|||
|
},
|
|||
|
})
|
|||
|
err := uploadManager.UploadReader(context.Background(), reader, &uploader.ObjectOptions{
|
|||
|
BucketName: bucket,
|
|||
|
ObjectName: &key,
|
|||
|
FileName: key,
|
|||
|
}, nil)
|
|||
|
if err != nil {
|
|||
|
log.Fatal("上传失败,可能是key和secret配错了:", err)
|
|||
|
return "", err
|
|||
|
}
|
|||
|
|
|||
|
return qiNiuDomain + "/" + key, err
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
func DeleteFromQiNiu(key string) error {
|
|||
|
accessKey := qiNiuAccessKey
|
|||
|
secretKey := qiNiuSecretKey
|
|||
|
bucketName := qiNiuBucket
|
|||
|
|
|||
|
mac := credentials.NewCredentials(accessKey, secretKey)
|
|||
|
objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
|
|||
|
Options: http_client.Options{Credentials: mac},
|
|||
|
})
|
|||
|
|
|||
|
bucket := objectsManager.Bucket(bucketName)
|
|||
|
|
|||
|
err := bucket.Object(key).Delete().Call(context.Background())
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|