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() }