|
|
package ObsUtil
|
|
|
|
|
|
import (
|
|
|
"dsSupport/Const"
|
|
|
"dsSupport/Utils/ConfigUtil"
|
|
|
"dsSupport/Utils/obs"
|
|
|
"fmt"
|
|
|
"net/http"
|
|
|
"os"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
/**
|
|
|
功能:判断一个文件在OBS上是不是存在
|
|
|
作者:黄海
|
|
|
时间:2020-07-16
|
|
|
*/
|
|
|
func IsExist(key string) bool {
|
|
|
_, err := http.Head("https://"+ConfigUtil.Endpoint+"/"+ConfigUtil.Bucket+"/"+Const.PreviewPrefix + key)
|
|
|
if err != nil {
|
|
|
return false
|
|
|
}
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:删除指定前缀的过期文件
|
|
|
作者:黄海
|
|
|
时间:2020-04-05
|
|
|
*/
|
|
|
func DeleteExpireFile(prefix string, remainDays int32) {
|
|
|
// 创建ObsClient结构体
|
|
|
var obsClient, _ = obs.New(ConfigUtil.Ak, ConfigUtil.Sk, ConfigUtil.Endpoint)
|
|
|
|
|
|
input := &obs.ListObjectsInput{}
|
|
|
input.Bucket = ConfigUtil.Bucket
|
|
|
// 设置列举带有prefix前缀的1000个对象
|
|
|
input.MaxKeys = 1000
|
|
|
input.Prefix = prefix
|
|
|
|
|
|
output, err := obsClient.ListObjects(input)
|
|
|
if err == nil {
|
|
|
for index, val := range output.Contents {
|
|
|
fmt.Printf("Content[%d]-OwnerId:%s, ETag:%s, Key:%s, LastModified:%s, Size:%d, StorageClass:%s\n",
|
|
|
index, val.Owner.ID, val.ETag, val.Key, val.LastModified, val.Size, val.StorageClass)
|
|
|
//判断是否过期
|
|
|
now := time.Now()
|
|
|
sumD := now.Sub(val.LastModified)
|
|
|
if int32(sumD.Hours()/24) > remainDays {
|
|
|
fmt.Println("发现超时文件,将删除:" + val.Key)
|
|
|
input := &obs.DeleteObjectInput{}
|
|
|
input.Bucket = ConfigUtil.Bucket
|
|
|
input.Key = val.Key
|
|
|
obsClient.DeleteObject(input)
|
|
|
fmt.Println("已成功删除!" + val.Key)
|
|
|
} else {
|
|
|
fmt.Println("没有过期,无需删除:" + val.Key)
|
|
|
}
|
|
|
}
|
|
|
} else if obsError, ok := err.(obs.ObsError); ok {
|
|
|
fmt.Printf("Code:%s\n", obsError.Code)
|
|
|
fmt.Printf("Message:%s\n", obsError.Message)
|
|
|
}
|
|
|
obsClient.Close()
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
功能:上传本地文件到华为云存储
|
|
|
作者:黄海
|
|
|
时间:2020-04-05
|
|
|
*/
|
|
|
func UploadFileMultiPart(key string, sourceFile string) {
|
|
|
// 创建ObsClient结构体
|
|
|
var obsClient, _ = obs.New(ConfigUtil.Ak, ConfigUtil.Sk, ConfigUtil.Endpoint)
|
|
|
// 初始化分段上传任务
|
|
|
input := &obs.InitiateMultipartUploadInput{}
|
|
|
input.Bucket = ConfigUtil.Bucket
|
|
|
input.Key = key
|
|
|
output, err := obsClient.InitiateMultipartUpload(input)
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
uploadId := output.UploadId
|
|
|
fmt.Printf("UploadId:%s\n", uploadId)
|
|
|
fmt.Println()
|
|
|
// 每段上传100MB
|
|
|
var partSize int64 = 100 * 1024 * 1024
|
|
|
stat, err := os.Stat(sourceFile)
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
fileSize := stat.Size()
|
|
|
// 计算需要上传的段数
|
|
|
partCount := int(fileSize / partSize)
|
|
|
if fileSize%partSize != 0 {
|
|
|
partCount++
|
|
|
}
|
|
|
// 执行并发上传段
|
|
|
partChan := make(chan obs.Part, 5)
|
|
|
for i := 0; i < partCount; i++ {
|
|
|
partNumber := i + 1
|
|
|
offset := int64(i) * partSize
|
|
|
currPartSize := partSize
|
|
|
if i+1 == partCount {
|
|
|
currPartSize = fileSize - offset
|
|
|
}
|
|
|
go func() {
|
|
|
uploadPartInput := &obs.UploadPartInput{}
|
|
|
uploadPartInput.Bucket = ConfigUtil.Bucket
|
|
|
uploadPartInput.Key = key
|
|
|
uploadPartInput.UploadId = uploadId
|
|
|
uploadPartInput.SourceFile = sourceFile
|
|
|
// 分段号
|
|
|
uploadPartInput.PartNumber = partNumber
|
|
|
// 分段在文件中的起始位置
|
|
|
uploadPartInput.Offset = offset
|
|
|
// 分段大小
|
|
|
uploadPartInput.PartSize = currPartSize
|
|
|
uploadPartInputOutput, err := obsClient.UploadPart(uploadPartInput)
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
fmt.Printf("%d finished\n", partNumber)
|
|
|
partChan <- obs.Part{ETag: uploadPartInputOutput.ETag, PartNumber: uploadPartInputOutput.PartNumber}
|
|
|
}()
|
|
|
}
|
|
|
parts := make([]obs.Part, 0, partCount)
|
|
|
// 等待上传完成
|
|
|
for {
|
|
|
part, ok := <-partChan
|
|
|
if !ok {
|
|
|
break
|
|
|
}
|
|
|
parts = append(parts, part)
|
|
|
|
|
|
if len(parts) == partCount {
|
|
|
close(partChan)
|
|
|
}
|
|
|
}
|
|
|
completeMultipartUploadInput := &obs.CompleteMultipartUploadInput{}
|
|
|
completeMultipartUploadInput.Bucket = ConfigUtil.Bucket
|
|
|
completeMultipartUploadInput.Key = key
|
|
|
completeMultipartUploadInput.UploadId = uploadId
|
|
|
completeMultipartUploadInput.Parts = parts
|
|
|
// 合并段
|
|
|
completeMultipartUploadOutput, err := obsClient.CompleteMultipartUpload(completeMultipartUploadInput)
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
fmt.Printf("RequestId:%s\n", completeMultipartUploadOutput.RequestId)
|
|
|
obsClient.Close()
|
|
|
}
|