最近更新时间:2023-01-16 10:18:47
分块上传分为以下三个步骤:
上传中,你可以使用Abort Multipart Upload取消上传,或者List Parts查看上传的分块。或者List Multipart Uploads查看当前的bucket下有多少个uploadid。
以下代码是分块上传完整示例:
package ks3test
import (
"bufio"
"bytes"
"github.com/ks3sdklib/aws-sdk-go/aws/awserr"
"github.com/ks3sdklib/aws-sdk-go/aws/awsutil"
"net/url"
"strconv"
"strings"
"testing"
"time"
// "io"
"fmt"
"github.com/ks3sdklib/aws-sdk-go/aws"
"github.com/ks3sdklib/aws-sdk-go/aws/credentials"
"github.com/ks3sdklib/aws-sdk-go/service/s3"
"net/http"
"os"
)
var bucket = string("yourbucket")
var key = string("yourkey")
var key_encode = string("yourkey")
var key_copy = string("yourkey")
var content = string("content")
var prefix = "test/" //目录名称
// 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
// 强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
// 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。
var cre = credentials.NewStaticCredentials("ak", "sk", "") //online
var svc = s3.New(&aws.Config{
//Region 可参考 [https://docs.ksyun.com/documents/6761](https://docs.ksyun.com/documents/6761)
Region: "BEIJING",
Credentials: cre,
//Endpoint 可参考 [https://docs.ksyun.com/documents/6761](https://docs.ksyun.com/documents/6761)
Endpoint: "ks3-cn-beijing.ksyuncs.com",
DisableSSL: true, //是否禁用https
LogLevel: 1, //是否开启日志,0为关闭日志,1为开启日志
LogHTTPBody: true, //是否把HTTP请求body打入日志
S3ForcePathStyle: true,
Logger: nil, //打日志的位置
})
//分块上传
//此操作将启动一个分块上传任务并返回 upload ID。在一个确定的分块上传任务中,upload ID用于关联所有分块。
//连续分块上传请求中的 upload ID由用户指定。在Complete Multipart Upload 和 Abort Multipart Upload请求中同样包含 upload ID。
//关于请求签名的问题,分块上传为一系列的请求(初始化分块上传,上传块,完成分块上传,终止分块上传),用户启动任务,发送一个或多个分块,最终完成任务。用户需要对每一个请求单独签名。
//注意: 当你启动分块上传后,并开始上传分块,你必须完成或者放弃上传任务,才能终止因为存储造成的收费。
func TestMultipartUpload(svc *s3.S3) {
key = "jdexe"
fileName := "d:/upload-test/jd.exe"
initRet, _ := svc.CreateMultipartUpload(&s3.CreateMultipartUploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
ACL: aws.String("public-read"),
ContentType: aws.String("application/octet-stream"),
})
//获取分块Id
uploadId := *initRet.UploadID
fmt.Printf("%s %s", "uploadId=", uploadId)
f, err := os.Open(fileName)
if err != nil {
fmt.Println("can't opened this file")
return
}
defer f.Close()
var i int64 = 1
//组装分块参数
compParts := []*s3.CompletedPart{}
partsNum := []int64{0}
s := make([]byte, 52428800)
for {
nr, err := f.Read(s[:])
if nr < 0 {
fmt.Fprintf(os.Stderr, "cat: error reading: %s\n", err.Error())
os.Exit(1)
} else if nr == 0 {
break
} else {
//上传分块
//此操作将在分块上传任务中上传一个块。
//在你上传任一块之前你必须先要启动一个分块上传任务。
//在你发送一个启动请求后,KS3会给你一个唯一的 upload ID。每次上传块时,都需要将上传ID包含在请求中。
//块的数量可以是1到10,000中的任意一个(包含1和10,000)。
//块序号用于标识一个块以及其在对象创建时的位置。如果你上传一个新的块,使用之前已经使用的序列号,那么之前的那个块将会被覆盖。
//当所有块总大小大于5M时,除了最后一个块没有大小限制外,其余的块的大小均要求在5MB以上。
//当所有块总大小小于5M时,除了最后一个块没有大小限制外,其余的块的大小均要求在100K以上。
//如果不符合上述要求,会返回413状态码。
//为了保证数据在传输过程中没有损坏,请使用 Content-MD5 头部。当使用此头部时,KS3会自动计算出MD5,并根据用户提供的MD5进行校验,如果不匹配,将会返回错误信息。
resp, _ := svc.UploadPart(&s3.UploadPartInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
PartNumber: aws.Long(i),
UploadID: aws.String(uploadId),
Body: bytes.NewReader(s[0:nr]),
ContentLength: aws.Long(int64(len(s[0:nr]))),
})
partsNum = append(partsNum, i)
compParts = append(compParts, &s3.CompletedPart{PartNumber: &partsNum[i], ETag: resp.ETag})
i++
fmt.Println("结果:\n", awsutil.StringValue(resp))
}
}
//此操作将完成对象装配之前的块上传任务 。
//用户启动一个分块上传任务后,会使用 Upload Parts 接口上传所有的块。成功上传所有相关块之后,用户需要调用此接口来完成分块上传。
//收到完成请求后,KS3将会根据块序号将所有的块组装起来创建一个新的对象。
//在用户的完成任务请求中需要用户提供分块列表,由于KS3将会按照列表将所有块连接起来,所以要求用户保证所有的块已经完成上传。
//对于分块列表中的每一个块,用户需要在上传块时添加块序号以及对象的 ETag 头部,KS3则会在块完成上传后回复完成响应。
//请注意,如果 Complete Multipart Upload 请求失败了,用户应用应当能够进行重试操作。
compRet, _ := svc.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
UploadID: aws.String(uploadId),
MultipartUpload: &s3.CompletedMultipartUpload{
Parts: compParts,
},
})
fmt.Println("结果:\n", awsutil.StringValue(compRet))
}
文档内容是否对您有帮助?
评价建议不能为空
非常感谢您的反馈,我们会继续努力做到更好!