开发者社区> 问答> 正文

go sdk 不同Bucket之间的文件拷贝

已解决

展开
收起
2018-01-21 03:33:30 668 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

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

    使用Bucket.CopyObjectBucket.CopyObjectToBucket拷贝文件,前者是同一个Bucket内的文件拷贝,后者是Bucket之间的文件拷贝。

    提示:

    • 拷贝文件的示例代码在sample/copy_objects.go

    同一个Bucket内的文件拷贝

        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)
        }
    
        _, err = bucket.CopyObject("my-object", "descObjectKey")
        if err != nil {
            // HandleError(err)
        }
    

    不同Bucket之间的文件拷贝

        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)
        }
    
        _, err = bucket.CopyObjectToBucket("my-object", "my-bucket-desc", "descObjectKey")
        if err != nil {
            // HandleError(err)
        }
    

    拷贝时处理文件元信息

    文件拷贝(CopyObject/CopyObjectToBucket)时对文件元信息的处理有两种选择,通过MetadataDirective参数指定:

    • oss.MetaCopy 与源文件相同,即拷贝源文件的元信息
    • oss.MetaReplace 使用新的元信息覆盖源文件的信息

    默认值是oss.MetaCopy。

    COPY时,MetadataDirective为MetaReplace时,用户可以指定新对象的如下的元信息:

    元信息 说明
    CacheControl 指定新Object被下载时的网页的缓存行为。
    ContentDisposition 指定新Object被下载时的名称。
    ContentEncoding 指定新Object被下载时的内容编码格式。
    Expires 指定新Object过期时间(seconds)更详细描述请参照RFC2616。
    ServerSideEncryption 指定OSS创建新Object时的服务器端加密编码算法。
    ObjectACL 指定OSS创建新Object时的访问权限。
    Meta 自定义参数,以"X-Oss-Meta-"为前缀的参数。
        import (
            "time"
            "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)
        }
    
        expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
        options := []oss.Option{
            oss.MetadataDirective(oss.MetaReplace),
            oss.Expires(expires),
            oss.ObjectACL(oss.ACLPublicRead),
            oss.Meta("MyMeta", "MyMetaValue")}
    
        _, err = bucket.CopyObject("my-object", "descObjectKey", options...)
        if err != nil {
            // HandleError(err)
        }
    

    限定拷贝条件

    文件拷贝时可以设置限定条件,条件满足时拷贝,不满足时报错不拷贝。可以使用的限定条件如下:

    参数 说明
    CopySourceIfMatch 如果源Object的ETAG值和用户提供的ETAG相等,则执行拷贝操作;否则返回错误。
    CopySourceIfNoneMatch 如果源Object的ETAG值和用户提供的ETAG不相等,则执行拷贝操作;否则返回错误。
    CopySourceIfModifiedSince 如果传入参数中的时间等于或者晚于源文件实际修改时间,则正常拷贝;否则返回错误。
    CopySourceIfUnmodifiedSince 如果源Object自从用户指定的时间以后被修改过,则执行拷贝操作;否则返回错误。
        import (
            "fmt"
            "time"
            "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)
        }
    
        date := time.Date(2015, time.November, 10, 23, 0, 0, 0, time.UTC)
        // 约束条件不满足,拷贝没有执行
        _, err = bucket.CopyObject("my-object", "descObjectKey", oss.CopySourceIfModifiedSince(date))
        fmt.Println("CopyObjectError:", err)
    
        // 约束条件满足,拷贝执行
        _, err = bucket.CopyObject("my-object", "descObjectKey", oss.CopySourceIfUnmodifiedSince(date))
        if err != nil {
            // HandleError(err)
        }
    

    提示:

    • Bucket.CopyObject、Bucket.CopyObjectToBucket都支持拷贝时处理文件元信息、限定拷贝条件。
    2018-01-25 16:59:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载
一个跨平台的云服务SDK需要什么 立即下载