开发者社区> 问答> 正文

go sdk分片上传

已解决

展开
收起
游客kcerthac5t5w4 2018-07-07 07:46:58 848 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    当上传大文件时,如果网络不稳定或者程序崩溃了,则整个上传就失败了。用户 不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次 还是无法完成上传。 通过Bucket.UploadFile接口来实现断点续传上传。它有以下参数:

    • objectKey 上传到OSS的Object名字
    • filePath 待上传的本地文件路径
    • partSize 分片上传大小,从100KB到5GB,单位是Byte
    • options 可选项,主要包括:
      • Routines 指定分片上传的并发数,默认是1,及不使用并发上传
      • Checkpoint 指定上传是否开启断点续传,及checkpoint文件的路径。默认断点续传功能关闭,checkpoint文件的路径可以指定为空,为与本地文件同 目录下的file.cp,其中file是本地文件的名字
      • 其它元信息,请参看上传时指定元信息

    其实现的原理是将要上传的文件分成若干个分片分别上传,最后所有分片都上传 成功后,完成整个文件的上传。在上传的过程中会记录当前上传的进度信息(记 录在checkpoint文件中),如果上传过程中某一分片上传失败,再次上传时会从 checkpoint文件中记录的点继续上传。这要求再次调用时要指定与上次相同的 checkpoint文件。上传完成后,checkpoint文件会被删除。

    提示:

    • 分片上传的示例代码在sample/put_object.go
        import "github.com/aliyun/aliyun-oss-go-sdk/oss"
    
        client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
        if err != nil {
            // HandleError(err)
        }
    
        bucket, err := client.Bucket("my-bucket")
        if err != nil {
            // HandleError(err)
        }
    
        // 分片大小100K,3个协程并发上传分片,使用断点续传
        err = bucket.UploadFile("my-object", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
        if err != nil {
            // HandleError(err)
        }
    

    注意:

    • SDK会将上传的中间状态信息记录在cp文件中,所以要确保用户对cp文件有写权限
    • cpt文件记录了上传的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则重新上传所有分片。整个上传完成后cpt文件会被删除。
    • 如果上传过程中本地文件发生了改变,则重新上传所有分片

    提示:

    • 指定断点续传checkpoint文件路径使用oss.Checkpoint(true, "your-cp-file.cp")
    • 使用bucket.UploadFile(objectKey, localFile, 100*1024),默认不使用分片并发上传、不启动断点续传

    获取所有已上传的分片信息

    您可以用Bucket.ListUploadedParts获取某个分片上传已上传的分片。

        import "fmt"
        import "github.com/aliyun/aliyun-oss-go-sdk/oss"
    
        client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
        if err != nil {
            // HandleError(err)
        }
    
        bucket, err := client.Bucket("my-bucket")
        if err != nil {
            // HandleError(err)
        }
    
        imur, err := bucket.InitiateMultipartUpload("my-object")
        if err != nil {
            // HandleError(err)
        }
    
        lsRes, err := bucket.ListUploadedParts(imur)
        if err != nil {
            // HandleError(err)
        }
        fmt.Println("Parts:", lsRes.UploadedParts)
    

    获取所有分片上传的任务

    通过Bucket.ListMultipartUploads来列出当前分片上传任务。主要的参数如下:

    参数 说明
    Delimiter 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素。
    MaxUploads 限定此次返回Multipart Uploads事件的最大数目,默认为1000,max-uploads取值不能大于1000。
    KeyMarker 所有Object名字的字典序大于KeyMarker参数值的Multipart事件。
    Prefix 限定返回的文件名(object)必须以Prefix作为前缀。注意使用Prefix查询时,返回的文件名(Object)中仍会包含Prefix。

    使用默认参数

        import "fmt"
        import "github.com/aliyun/aliyun-oss-go-sdk/oss"
    
        client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
        if err != nil {
            // HandleError(err)
        }
    
        bucket, err := client.Bucket("my-bucket")
        if err != nil {
            // HandleError(err)
        }
    
        lsRes, err := bucket.ListMultipartUploads()
        if err != nil {
            // HandleError(err)
        }
        fmt.Println("Uploads:", lsRes.Uploads)
    

    指定前缀

        lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"))
        if err != nil {
            // HandleError(err)
        }
        fmt.Println("Uploads:", lsRes.Uploads)
    

    指定最多返回100条结果数据

        lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
        if err != nil {
            // HandleError(err)
        }
        fmt.Println("Uploads:", lsRes.Uploads)
    

    同时指定前缀和最大返回条数

        lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"), oss.MaxUploads(100))
        if err != nil {
            // HandleError(err)
        }
        fmt.Println("Uploads:", lsRes.Uploads)
    
    2018-07-07 18:08:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载