github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/sample/append_object.go (about)

     1  // Package sample examples
     2  package sample
     3  
     4  import (
     5  	"bytes"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"strconv"
    10  	"strings"
    11  
    12  	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    13  )
    14  
    15  // AppendObjectSample shows the append file's usage
    16  func AppendObjectSample() {
    17  	// Create bucket
    18  	bucket, err := GetTestBucket(bucketName)
    19  	if err != nil {
    20  		HandleError(err)
    21  	}
    22  
    23  	err = bucket.DeleteObject(objectKey)
    24  
    25  	var str = "弃我去者,昨日之日不可留。 乱我心者,今日之日多烦忧!"
    26  	var nextPos int64
    27  
    28  	// Case 1: Append a string to the object
    29  	// The first append position is 0 and the return value is for the next append's position.
    30  	nextPos, err = bucket.AppendObject(objectKey, strings.NewReader(str), nextPos)
    31  	if err != nil {
    32  		HandleError(err)
    33  	}
    34  
    35  	// Second append
    36  	nextPos, err = bucket.AppendObject(objectKey, strings.NewReader(str), nextPos)
    37  	if err != nil {
    38  		HandleError(err)
    39  	}
    40  
    41  	// Download
    42  	body, err := bucket.GetObject(objectKey)
    43  	if err != nil {
    44  		HandleError(err)
    45  	}
    46  	data, err := ioutil.ReadAll(body)
    47  	body.Close()
    48  	if err != nil {
    49  		HandleError(err)
    50  	}
    51  	fmt.Println(objectKey, ":", string(data))
    52  
    53  	err = bucket.DeleteObject(objectKey)
    54  	if err != nil {
    55  		HandleError(err)
    56  	}
    57  
    58  	// Case 2: Append byte array to the object
    59  	nextPos = 0
    60  	// The first append position is 0, and the return value is for the next append's position.
    61  	nextPos, err = bucket.AppendObject(objectKey, bytes.NewReader([]byte(str)), nextPos)
    62  	if err != nil {
    63  		HandleError(err)
    64  	}
    65  
    66  	// Second append
    67  	nextPos, err = bucket.AppendObject(objectKey, bytes.NewReader([]byte(str)), nextPos)
    68  	if err != nil {
    69  		HandleError(err)
    70  	}
    71  
    72  	// Download
    73  	body, err = bucket.GetObject(objectKey)
    74  	if err != nil {
    75  		HandleError(err)
    76  	}
    77  	data, err = ioutil.ReadAll(body)
    78  	body.Close()
    79  	if err != nil {
    80  		HandleError(err)
    81  	}
    82  	fmt.Println(objectKey, ":", string(data))
    83  
    84  	err = bucket.DeleteObject(objectKey)
    85  	if err != nil {
    86  		HandleError(err)
    87  	}
    88  
    89  	// Case 3: Append a local file to the object
    90  	fd, err := os.Open(localFile)
    91  	if err != nil {
    92  		HandleError(err)
    93  	}
    94  	defer fd.Close()
    95  
    96  	nextPos = 0
    97  	nextPos, err = bucket.AppendObject(objectKey, fd, nextPos)
    98  	if err != nil {
    99  		HandleError(err)
   100  	}
   101  
   102  	// Case 4: Get the next append position by GetObjectDetailedMeta
   103  	props, err := bucket.GetObjectDetailedMeta(objectKey)
   104  	nextPos, err = strconv.ParseInt(props.Get(oss.HTTPHeaderOssNextAppendPosition), 10, 64)
   105  	if err != nil {
   106  		HandleError(err)
   107  	}
   108  
   109  	nextPos, err = bucket.AppendObject(objectKey, strings.NewReader(str), nextPos)
   110  	if err != nil {
   111  		HandleError(err)
   112  	}
   113  
   114  	err = bucket.DeleteObject(objectKey)
   115  	if err != nil {
   116  		HandleError(err)
   117  	}
   118  
   119  	// Case 5: Specify the object properties for the first append, including the "x-oss-meta"'s custom metadata.
   120  	options := []oss.Option{
   121  		oss.Expires(futureDate),
   122  		oss.ObjectACL(oss.ACLPublicRead),
   123  		oss.Meta("myprop", "mypropval")}
   124  	nextPos = 0
   125  	fd.Seek(0, os.SEEK_SET)
   126  	nextPos, err = bucket.AppendObject(objectKey, strings.NewReader(str), nextPos, options...)
   127  	if err != nil {
   128  		HandleError(err)
   129  	}
   130  	// Second append
   131  	fd.Seek(0, os.SEEK_SET)
   132  	nextPos, err = bucket.AppendObject(objectKey, strings.NewReader(str), nextPos)
   133  	if err != nil {
   134  		HandleError(err)
   135  	}
   136  
   137  	props, err = bucket.GetObjectDetailedMeta(objectKey)
   138  	if err != nil {
   139  		HandleError(err)
   140  	}
   141  	fmt.Println("myprop:", props.Get("x-oss-meta-myprop"))
   142  
   143  	goar, err := bucket.GetObjectACL(objectKey)
   144  	if err != nil {
   145  		HandleError(err)
   146  	}
   147  	fmt.Println("Object ACL:", goar.ACL)
   148  
   149  	// Case 6: Set the storage classes.OSS provides three storage classes: Standard, Infrequent Access, and Archive.
   150  	// Upload a strings, and you can append some strings in the behind of object. but the object is 'Archive' storange class.
   151  	// An object created with the AppendObject operation is an appendable object. set the object storange-class to 'Archive'.
   152  	nextPos, err = bucket.AppendObject(appendObjectKey, strings.NewReader("昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,"), nextPos, oss.ObjectStorageClass("Archive"))
   153  	if err != nil {
   154  		HandleError(err)
   155  	}
   156  
   157  	// Delete the object and bucket
   158  	err = DeleteTestBucketAndObject(bucketName)
   159  	if err != nil {
   160  		HandleError(err)
   161  	}
   162  
   163  	fmt.Println("AppendObjectSample completed")
   164  }