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 }