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

     1  package sample
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"encoding/json"
     7  	"fmt"
     8  	"os"
     9  	"strings"
    10  	"time"
    11  
    12  	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    13  )
    14  
    15  // PutObjectSample illustrates two methods for uploading a file: simple upload and multipart upload.
    16  func PutObjectSample() {
    17  	// Create bucket
    18  	bucket, err := GetTestBucket(bucketName)
    19  	if err != nil {
    20  		HandleError(err)
    21  	}
    22  
    23  	var val = "花间一壶酒,独酌无相亲。 举杯邀明月,对影成三人。"
    24  
    25  	// Case 1: Upload an object from a string
    26  	err = bucket.PutObject(objectKey, strings.NewReader(val))
    27  	if err != nil {
    28  		HandleError(err)
    29  	}
    30  
    31  	// Case 2: Upload an object whose value is a byte[]
    32  	err = bucket.PutObject(objectKey, bytes.NewReader([]byte(val)))
    33  	if err != nil {
    34  		HandleError(err)
    35  	}
    36  
    37  	// Case 3: Upload the local file with file handle, user should open the file at first.
    38  	fd, err := os.Open(localFile)
    39  	if err != nil {
    40  		HandleError(err)
    41  	}
    42  	defer fd.Close()
    43  
    44  	err = bucket.PutObject(objectKey, fd)
    45  	if err != nil {
    46  		HandleError(err)
    47  	}
    48  
    49  	// Case 4: Upload an object with local file name, user need not open the file.
    50  	err = bucket.PutObjectFromFile(objectKey, localFile)
    51  	if err != nil {
    52  		HandleError(err)
    53  	}
    54  
    55  	// Case 5: Upload an object with specified properties, PutObject/PutObjectFromFile/UploadFile also support this feature.
    56  	options := []oss.Option{
    57  		oss.Expires(futureDate),
    58  		oss.ObjectACL(oss.ACLPublicRead),
    59  		oss.Meta("myprop", "mypropval"),
    60  	}
    61  	err = bucket.PutObject(objectKey, strings.NewReader(val), options...)
    62  	if err != nil {
    63  		HandleError(err)
    64  	}
    65  
    66  	props, err := bucket.GetObjectDetailedMeta(objectKey)
    67  	if err != nil {
    68  		HandleError(err)
    69  	}
    70  	fmt.Println("Object Meta:", props)
    71  
    72  	// Case 6: Upload an object with sever side encrpytion kms and kms id specified
    73  	err = bucket.PutObject(objectKey, strings.NewReader(val), oss.ServerSideEncryption("KMS"), oss.ServerSideEncryptionKeyID(kmsID))
    74  	if err != nil {
    75  		HandleError(err)
    76  	}
    77  
    78  	// Case 7: Upload an object with callback
    79  	callbackMap := map[string]string{}
    80  	callbackMap["callbackUrl"] = "http://oss-demo.aliyuncs.com:23450"
    81  	callbackMap["callbackHost"] = "oss-cn-hangzhou.aliyuncs.com"
    82  	callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}"
    83  	callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
    84  
    85  	callbackBuffer := bytes.NewBuffer([]byte{})
    86  	callbackEncoder := json.NewEncoder(callbackBuffer)
    87  	//do not encode '&' to "\u0026"
    88  	callbackEncoder.SetEscapeHTML(false)
    89  	err = callbackEncoder.Encode(callbackMap)
    90  	if err != nil {
    91  		HandleError(err)
    92  	}
    93  
    94  	callbackVal := base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
    95  	err = bucket.PutObject(objectKey, strings.NewReader(val), oss.Callback(callbackVal))
    96  	if err != nil {
    97  		HandleError(err)
    98  	}
    99  
   100  	// Case 7-2: Upload an object with callback and get callback body
   101  	callbackMap = map[string]string{}
   102  	callbackMap["callbackUrl"] = "http://oss-demo.aliyuncs.com:23450"
   103  	callbackMap["callbackHost"] = "oss-cn-hangzhou.aliyuncs.com"
   104  	callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}"
   105  	callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
   106  
   107  	callbackBuffer = bytes.NewBuffer([]byte{})
   108  	callbackEncoder = json.NewEncoder(callbackBuffer)
   109  	//do not encode '&' to "\u0026"
   110  	callbackEncoder.SetEscapeHTML(false)
   111  	err = callbackEncoder.Encode(callbackMap)
   112  	if err != nil {
   113  		HandleError(err)
   114  	}
   115  
   116  	callbackVal = base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
   117  	var body []byte
   118  	err = bucket.PutObject(objectKey, strings.NewReader(val), oss.Callback(callbackVal), oss.CallbackResult(&body))
   119  
   120  	if err != nil {
   121  		e, ok := err.(oss.UnexpectedStatusCodeError)
   122  		if !(ok && e.Got() == 203) {
   123  			HandleError(err)
   124  		}
   125  	}
   126  
   127  	fmt.Printf("callback body:%s\n", body)
   128  
   129  	// Case 8: Big file's multipart upload. It supports concurrent upload with resumable upload.
   130  	// multipart upload with 100K as part size. By default 1 coroutine is used and no checkpoint is used.
   131  	err = bucket.UploadFile(objectKey, localFile, 100*1024)
   132  	if err != nil {
   133  		HandleError(err)
   134  	}
   135  
   136  	// Part size is 100K and 3 coroutines are used
   137  	err = bucket.UploadFile(objectKey, localFile, 100*1024, oss.Routines(3))
   138  	if err != nil {
   139  		HandleError(err)
   140  	}
   141  
   142  	// Part size is 100K and 3 coroutines with checkpoint
   143  	err = bucket.UploadFile(objectKey, localFile, 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
   144  	if err != nil {
   145  		HandleError(err)
   146  	}
   147  
   148  	// Specify the local file path for checkpoint files.
   149  	// the 2nd parameter of Checkpoint can specify the file path, when the file path is empty, it will upload the directory.
   150  	err = bucket.UploadFile(objectKey, localFile, 100*1024, oss.Checkpoint(true, localFile+".cp"))
   151  	if err != nil {
   152  		HandleError(err)
   153  	}
   154  
   155  	// Case 8-1:Big file's multipart upload. Set callback and get callback body
   156  
   157  	//The local file is partitioned, and the number of partitions is specified as 3.
   158  	chunks, err := oss.SplitFileByPartNum(localFile, 3)
   159  	fd, err = os.Open(localFile)
   160  	defer fd.Close()
   161  	//Specify the expiration time.
   162  	expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
   163  	// If you need to set the request header when initializing fragmentation, please refer to the following example code.
   164  	options = []oss.Option{
   165  		oss.MetadataDirective(oss.MetaReplace),
   166  		oss.Expires(expires),
   167  		// Specifies the web page caching behavior when the object is downloaded.
   168  		// oss.CacheControl("no-cache"),
   169  		// Specifies the name of the object when it is downloaded.
   170  		// oss.ContentDisposition("attachment;filename=FileName.txt"),
   171  		// Specifies the content encoding format of the object.
   172  		// oss.ContentEncoding("gzip"),
   173  		// Specifies to encode the returned key. Currently, URL encoding is supported.
   174  		// oss.EncodingType("url"),
   175  		// Specifies the storage type of the object.
   176  		// oss.ObjectStorageClass(oss.StorageStandard),
   177  	}
   178  	// Step 1: initialize a fragment upload event and specify the storage type as standard storage
   179  	imur, err := bucket.InitiateMultipartUpload(objectKey, options...)
   180  	// Step 2: upload fragments.
   181  	var parts []oss.UploadPart
   182  	for _, chunk := range chunks {
   183  		fd.Seek(chunk.Offset, os.SEEK_SET)
   184  		// Call the uploadpart method to upload each fragment.
   185  		part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
   186  		if err != nil {
   187  			HandleError(err)
   188  		}
   189  		parts = append(parts, part)
   190  	}
   191  
   192  	// Construct callback map
   193  	callbackMap = map[string]string{}
   194  	callbackMap["callbackUrl"] = "www.aliyuncs.com"
   195  	callbackMap["callbackBody"] = "filename=demo.go&name=golang"
   196  	callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
   197  
   198  	callbackBuffer = bytes.NewBuffer([]byte{})
   199  	callbackEncoder = json.NewEncoder(callbackBuffer)
   200  	//do not encode '&' to "\u0026"
   201  	callbackEncoder.SetEscapeHTML(false)
   202  	err = callbackEncoder.Encode(callbackMap)
   203  	if err != nil {
   204  		HandleError(err)
   205  	}
   206  
   207  	callbackVal = base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
   208  
   209  	var pbody []byte
   210  	// Step 3: complete fragment uploading
   211  	_, err = bucket.CompleteMultipartUpload(imur, parts, oss.Callback(callbackVal), oss.CallbackResult(&pbody))
   212  	if err != nil {
   213  		HandleError(err)
   214  	}
   215  	fmt.Printf("callback body:%s/n", pbody)
   216  
   217  	// Case 9: Set the storage classes.OSS provides three storage classes: Standard, Infrequent Access, and Archive.
   218  	// Supported APIs: PutObject, CopyObject, UploadFile, AppendObject...
   219  	err = bucket.PutObject(objectKey, strings.NewReader(val), oss.ObjectStorageClass("IA"))
   220  	if err != nil {
   221  		HandleError(err)
   222  	}
   223  
   224  	// Upload a local file, and set the object's storage-class to 'Archive'.
   225  	err = bucket.UploadFile(objectKey, localFile, 100*1024, oss.ObjectStorageClass("Archive"))
   226  	if err != nil {
   227  		HandleError(err)
   228  	}
   229  
   230  	// Delete object and bucket
   231  	err = DeleteTestBucketAndObject(bucketName)
   232  	if err != nil {
   233  		HandleError(err)
   234  	}
   235  
   236  	fmt.Println("PutObjectSample completed")
   237  }