追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。

注意事项

  • 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。
  • 当文件已存在时,如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容;如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常;如果文件为非追加类型文件时,则抛出ObjectNotAppendable异常。
  • 追加类型文件暂不支持CopyObject操作。

示例代码

以下代码用于追加上传文件:

package main

import (
    "fmt"
    "os"
    "strings"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 填写Bucket名称,例如examplebucket。
    bucket, err := client.Bucket("examplebucket")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 填写不包含Bucket名称在内的Object的完整路径,例如exampledir/exampleobject.txt。
    objectName := "exampledir/exampleobject.txt"
    var nextPos int64 = 0
    // 第一次追加上传的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。    
    // 指定过期时间。
    expires := time.Date("2021, time.December, 10, 23, 0, 0, 0, time.UTC")
    option := []oss.Option{
        oss.Expires(expires),
        // 指定该Object被下载时的网页缓存行为。
        //oss.CacheControl("no-cache"),
        // 指定该Object被下载时的名称。
        //oss.ContentDisposition("attachment;filename=FileName.txt"),
        // 指定该Object的内容编码格式。
        //oss.ContentEncoding("gzip"),
        // 指定Object的存储类型。
        //oss.ObjectStorageClass(oss.StorageStandard),
        // 指定Object的访问权限。
        //oss.ObjectACL(oss.ACLPrivate),
        // 指定服务器端加密方式。
        //oss.ServerSideEncryption("AES256"),
        // 创建AppendObject时可以添加x-oss-meta-*,继续追加时不可以携带此参数。如果配置以x-oss-meta-*为前缀的参数,则该参数视为元数据。
        //oss.Meta("x-oss-meta-author", "Alice"),
    }


    nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue1"), nextPos,option...)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 如果不是第一次追加上传,可以通过bucket.GetObjectDetailedMeta方法或上次追加返回值的X-Oss-Next-Append-Position的属性,获取追加位置。
    //props, err := bucket.GetObjectDetailedMeta("objectName")
    //if err != nil {
    //    fmt.Println("Error:", err)
    //    os.Exit(-1)
    //}
    //nextPos, err = strconv.ParseInt(props.Get("X-Oss-Next-Append-Position"), 10, 64)
    //if err != nil {
    //    fmt.Println("Error:", err)
    //    os.Exit(-1)
    //}

    // 第二次追加上传。
    nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue2"), nextPos)
    if err != nil {
        fmt.Println("Error:", err,"aaa")
        os.Exit(-1)
    }

    // 您可以进行多次追加上传操作。
}

相关文档

  • 关于追加上传的完整示例代码,请参见GitHub示例
  • 关于追加上传的API接口说明,请参见AppendObject