github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/multipart_test.go (about) 1 // multipart test 2 3 package oss 4 5 import ( 6 "bytes" 7 "encoding/base64" 8 "encoding/json" 9 "math/rand" 10 "net/http" 11 "os" 12 "strconv" 13 "strings" 14 15 . "gopkg.in/check.v1" 16 ) 17 18 type OssBucketMultipartSuite struct { 19 cloudBoxControlClient *Client 20 client *Client 21 bucket *Bucket 22 } 23 24 var _ = Suite(&OssBucketMultipartSuite{}) 25 26 // SetUpSuite runs once when the suite starts running 27 func (s *OssBucketMultipartSuite) SetUpSuite(c *C) { 28 bucketName := bucketNamePrefix + RandLowStr(6) 29 if cloudboxControlEndpoint == "" { 30 client, err := New(endpoint, accessID, accessKey) 31 c.Assert(err, IsNil) 32 s.client = client 33 34 s.client.CreateBucket(bucketName) 35 36 bucket, err := s.client.Bucket(bucketName) 37 c.Assert(err, IsNil) 38 s.bucket = bucket 39 } else { 40 client, err := New(cloudboxEndpoint, accessID, accessKey) 41 c.Assert(err, IsNil) 42 s.client = client 43 44 controlClient, err := New(cloudboxControlEndpoint, accessID, accessKey) 45 c.Assert(err, IsNil) 46 s.cloudBoxControlClient = controlClient 47 controlClient.CreateBucket(bucketName) 48 49 bucket, err := s.client.Bucket(bucketName) 50 c.Assert(err, IsNil) 51 s.bucket = bucket 52 } 53 54 // Delete part 55 keyMarker := KeyMarker("") 56 uploadIDMarker := UploadIDMarker("") 57 for { 58 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker) 59 c.Assert(err, IsNil) 60 for _, upload := range lmur.Uploads { 61 var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName, 62 Key: upload.Key, UploadID: upload.UploadID} 63 err = s.bucket.AbortMultipartUpload(imur) 64 c.Assert(err, IsNil) 65 } 66 keyMarker = KeyMarker(lmur.NextKeyMarker) 67 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker) 68 if !lmur.IsTruncated { 69 break 70 } 71 } 72 73 // Delete objects 74 marker := Marker("") 75 for { 76 lor, err := s.bucket.ListObjects(marker) 77 c.Assert(err, IsNil) 78 for _, object := range lor.Objects { 79 err = s.bucket.DeleteObject(object.Key) 80 c.Assert(err, IsNil) 81 } 82 marker = Marker(lor.NextMarker) 83 if !lor.IsTruncated { 84 break 85 } 86 } 87 88 testLogger.Println("test multipart started") 89 } 90 91 // TearDownSuite runs before each test or benchmark starts running 92 func (s *OssBucketMultipartSuite) TearDownSuite(c *C) { 93 // Delete part 94 keyMarker := KeyMarker("") 95 uploadIDMarker := UploadIDMarker("") 96 for { 97 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker) 98 c.Assert(err, IsNil) 99 for _, upload := range lmur.Uploads { 100 var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName, 101 Key: upload.Key, UploadID: upload.UploadID} 102 err = s.bucket.AbortMultipartUpload(imur) 103 c.Assert(err, IsNil) 104 } 105 keyMarker = KeyMarker(lmur.NextKeyMarker) 106 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker) 107 if !lmur.IsTruncated { 108 break 109 } 110 } 111 112 // Delete objects 113 marker := Marker("") 114 for { 115 lor, err := s.bucket.ListObjects(marker) 116 c.Assert(err, IsNil) 117 for _, object := range lor.Objects { 118 err = s.bucket.DeleteObject(object.Key) 119 c.Assert(err, IsNil) 120 } 121 marker = Marker(lor.NextMarker) 122 if !lor.IsTruncated { 123 break 124 } 125 } 126 127 // Delete bucket 128 if s.cloudBoxControlClient != nil { 129 err := s.cloudBoxControlClient.DeleteBucket(s.bucket.BucketName) 130 c.Assert(err, IsNil) 131 } else { 132 err := s.client.DeleteBucket(s.bucket.BucketName) 133 c.Assert(err, IsNil) 134 } 135 136 testLogger.Println("test multipart completed") 137 } 138 139 // SetUpTest runs after each test or benchmark runs 140 func (s *OssBucketMultipartSuite) SetUpTest(c *C) { 141 err := removeTempFiles("../oss", ".jpg") 142 c.Assert(err, IsNil) 143 } 144 145 // TearDownTest runs once after all tests or benchmarks have finished running 146 func (s *OssBucketMultipartSuite) TearDownTest(c *C) { 147 err := removeTempFiles("../oss", ".jpg") 148 c.Assert(err, IsNil) 149 150 err = removeTempFiles("../oss", ".temp") 151 c.Assert(err, IsNil) 152 153 err = removeTempFiles("../oss", ".txt1") 154 c.Assert(err, IsNil) 155 156 err = removeTempFiles("../oss", ".txt2") 157 c.Assert(err, IsNil) 158 } 159 160 // TestMultipartUpload 161 func (s *OssBucketMultipartSuite) TestMultipartUpload(c *C) { 162 objectName := objectNamePrefix + RandStr(8) 163 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 164 165 chunks, err := SplitFileByPartNum(fileName, 3) 166 c.Assert(err, IsNil) 167 testLogger.Println("chunks:", chunks) 168 169 options := []Option{ 170 Expires(futureDate), Meta("my", "myprop"), 171 } 172 173 fd, err := os.Open(fileName) 174 c.Assert(err, IsNil) 175 defer fd.Close() 176 177 imur, err := s.bucket.InitiateMultipartUpload(objectName, options...) 178 c.Assert(err, IsNil) 179 var parts []UploadPart 180 for _, chunk := range chunks { 181 fd.Seek(chunk.Offset, os.SEEK_SET) 182 part, err := s.bucket.UploadPart(imur, fd, chunk.Size, chunk.Number) 183 c.Assert(err, IsNil) 184 parts = append(parts, part) 185 } 186 187 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 188 c.Assert(err, IsNil) 189 testLogger.Println("cmur:", cmur) 190 191 meta, err := s.bucket.GetObjectDetailedMeta(objectName) 192 c.Assert(err, IsNil) 193 testLogger.Println("GetObjectDetailedMeta:", meta) 194 c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop") 195 c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat)) 196 c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart") 197 198 err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg") 199 c.Assert(err, IsNil) 200 201 err = s.bucket.DeleteObject(objectName) 202 c.Assert(err, IsNil) 203 } 204 205 // TestMultipartUploadFromFile 206 func (s *OssBucketMultipartSuite) TestMultipartUploadFromFile(c *C) { 207 objectName := objectNamePrefix + RandStr(8) 208 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 209 210 chunks, err := SplitFileByPartNum(fileName, 3) 211 c.Assert(err, IsNil) 212 testLogger.Println("chunks:", chunks) 213 214 options := []Option{ 215 Expires(futureDate), Meta("my", "myprop"), 216 } 217 imur, err := s.bucket.InitiateMultipartUpload(objectName, options...) 218 c.Assert(err, IsNil) 219 var parts []UploadPart 220 for _, chunk := range chunks { 221 part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number) 222 c.Assert(err, IsNil) 223 parts = append(parts, part) 224 } 225 226 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 227 c.Assert(err, IsNil) 228 testLogger.Println("cmur:", cmur) 229 230 meta, err := s.bucket.GetObjectDetailedMeta(objectName) 231 c.Assert(err, IsNil) 232 testLogger.Println("GetObjectDetailedMeta:", meta) 233 c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop") 234 c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat)) 235 c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart") 236 237 err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg") 238 c.Assert(err, IsNil) 239 240 err = s.bucket.DeleteObject(objectName) 241 c.Assert(err, IsNil) 242 } 243 244 // TestUploadPartCopy 245 func (s *OssBucketMultipartSuite) TestUploadPartCopy(c *C) { 246 objectSrc := objectNamePrefix + RandStr(8) + "-src" 247 objectDest := objectNamePrefix + RandStr(8) + "-dest" 248 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 249 250 chunks, err := SplitFileByPartNum(fileName, 3) 251 c.Assert(err, IsNil) 252 testLogger.Println("chunks:", chunks) 253 254 err = s.bucket.PutObjectFromFile(objectSrc, fileName) 255 c.Assert(err, IsNil) 256 257 options := []Option{ 258 Expires(futureDate), Meta("my", "myprop"), 259 } 260 imur, err := s.bucket.InitiateMultipartUpload(objectDest, options...) 261 c.Assert(err, IsNil) 262 var parts []UploadPart 263 for _, chunk := range chunks { 264 part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number)) 265 c.Assert(err, IsNil) 266 parts = append(parts, part) 267 } 268 269 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 270 c.Assert(err, IsNil) 271 testLogger.Println("cmur:", cmur) 272 273 meta, err := s.bucket.GetObjectDetailedMeta(objectDest) 274 c.Assert(err, IsNil) 275 testLogger.Println("GetObjectDetailedMeta:", meta) 276 c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop") 277 c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat)) 278 c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart") 279 280 err = s.bucket.GetObjectToFile(objectDest, "newpic2.jpg") 281 c.Assert(err, IsNil) 282 283 err = s.bucket.DeleteObject(objectSrc) 284 c.Assert(err, IsNil) 285 err = s.bucket.DeleteObject(objectDest) 286 c.Assert(err, IsNil) 287 } 288 289 func (s *OssBucketMultipartSuite) TestListUploadedParts(c *C) { 290 objectName := objectNamePrefix + RandStr(8) 291 objectSrc := objectName + "-src" 292 objectDest := objectName + "-dest" 293 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 294 295 chunks, err := SplitFileByPartSize(fileName, 100*1024) 296 c.Assert(err, IsNil) 297 testLogger.Println("chunks:", chunks) 298 299 err = s.bucket.PutObjectFromFile(objectSrc, fileName) 300 c.Assert(err, IsNil) 301 302 // Upload 303 imurUpload, err := s.bucket.InitiateMultipartUpload(objectName) 304 var partsUpload []UploadPart 305 for _, chunk := range chunks { 306 part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number)) 307 c.Assert(err, IsNil) 308 partsUpload = append(partsUpload, part) 309 } 310 311 // Copy 312 imurCopy, err := s.bucket.InitiateMultipartUpload(objectDest) 313 var partsCopy []UploadPart 314 for _, chunk := range chunks { 315 part, err := s.bucket.UploadPartCopy(imurCopy, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number)) 316 c.Assert(err, IsNil) 317 partsCopy = append(partsCopy, part) 318 } 319 320 // List 321 lupr, err := s.bucket.ListUploadedParts(imurUpload) 322 c.Assert(err, IsNil) 323 testLogger.Println("lupr:", lupr) 324 c.Assert(len(lupr.UploadedParts), Equals, len(chunks)) 325 326 lupr, err = s.bucket.ListUploadedParts(imurCopy) 327 c.Assert(err, IsNil) 328 testLogger.Println("lupr:", lupr) 329 c.Assert(len(lupr.UploadedParts), Equals, len(chunks)) 330 331 lmur, err := s.bucket.ListMultipartUploads() 332 c.Assert(err, IsNil) 333 testLogger.Println("lmur:", lmur) 334 335 // Complete 336 _, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload) 337 c.Assert(err, IsNil) 338 _, err = s.bucket.CompleteMultipartUpload(imurCopy, partsCopy) 339 c.Assert(err, IsNil) 340 341 // Download 342 err = s.bucket.GetObjectToFile(objectDest, "newpic3.jpg") 343 c.Assert(err, IsNil) 344 err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg") 345 c.Assert(err, IsNil) 346 347 err = s.bucket.DeleteObject(objectName) 348 c.Assert(err, IsNil) 349 err = s.bucket.DeleteObject(objectDest) 350 c.Assert(err, IsNil) 351 err = s.bucket.DeleteObject(objectSrc) 352 c.Assert(err, IsNil) 353 } 354 355 func (s *OssBucketMultipartSuite) TestAbortMultipartUpload(c *C) { 356 objectName := objectNamePrefix + RandStr(8) 357 objectSrc := objectName + "-src" 358 objectDest := objectName + "-dest" 359 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 360 361 chunks, err := SplitFileByPartSize(fileName, 100*1024) 362 c.Assert(err, IsNil) 363 testLogger.Println("chunks:", chunks) 364 365 err = s.bucket.PutObjectFromFile(objectSrc, fileName) 366 c.Assert(err, IsNil) 367 368 // Upload 369 imurUpload, err := s.bucket.InitiateMultipartUpload(objectName) 370 var partsUpload []UploadPart 371 for _, chunk := range chunks { 372 part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number)) 373 c.Assert(err, IsNil) 374 partsUpload = append(partsUpload, part) 375 } 376 377 // Copy 378 imurCopy, err := s.bucket.InitiateMultipartUpload(objectDest) 379 var partsCopy []UploadPart 380 for _, chunk := range chunks { 381 part, err := s.bucket.UploadPartCopy(imurCopy, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number)) 382 c.Assert(err, IsNil) 383 partsCopy = append(partsCopy, part) 384 } 385 386 // List 387 lupr, err := s.bucket.ListUploadedParts(imurUpload) 388 c.Assert(err, IsNil) 389 testLogger.Println("lupr:", lupr) 390 c.Assert(len(lupr.UploadedParts), Equals, len(chunks)) 391 392 lupr, err = s.bucket.ListUploadedParts(imurCopy) 393 c.Assert(err, IsNil) 394 testLogger.Println("lupr:", lupr) 395 c.Assert(len(lupr.UploadedParts), Equals, len(chunks)) 396 397 lmur, err := s.bucket.ListMultipartUploads() 398 c.Assert(err, IsNil) 399 testLogger.Println("lmur:", lmur) 400 c.Assert(len(lmur.Uploads), Equals, 2) 401 402 // Abort 403 err = s.bucket.AbortMultipartUpload(imurUpload) 404 c.Assert(err, IsNil) 405 err = s.bucket.AbortMultipartUpload(imurCopy) 406 c.Assert(err, IsNil) 407 408 lmur, err = s.bucket.ListMultipartUploads() 409 c.Assert(err, IsNil) 410 testLogger.Println("lmur:", lmur) 411 c.Assert(len(lmur.Uploads), Equals, 0) 412 413 // Download 414 err = s.bucket.GetObjectToFile(objectDest, "newpic3.jpg") 415 c.Assert(err, NotNil) 416 err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg") 417 c.Assert(err, NotNil) 418 } 419 420 // TestUploadPartCopyWithConstraints 421 func (s *OssBucketMultipartSuite) TestUploadPartCopyWithConstraints(c *C) { 422 objectSrc := objectNamePrefix + RandStr(8) + "-src" 423 objectDest := objectNamePrefix + RandStr(8) + "-dest" 424 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 425 426 chunks, err := SplitFileByPartNum(fileName, 3) 427 c.Assert(err, IsNil) 428 testLogger.Println("chunks:", chunks) 429 430 err = s.bucket.PutObjectFromFile(objectSrc, fileName) 431 c.Assert(err, IsNil) 432 433 imur, err := s.bucket.InitiateMultipartUpload(objectDest) 434 var parts []UploadPart 435 for _, chunk := range chunks { 436 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number), 437 CopySourceIfModifiedSince(futureDate)) 438 c.Assert(err, NotNil) 439 } 440 441 for _, chunk := range chunks { 442 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number), 443 CopySourceIfUnmodifiedSince(futureDate)) 444 c.Assert(err, IsNil) 445 } 446 447 meta, err := s.bucket.GetObjectDetailedMeta(objectSrc) 448 c.Assert(err, IsNil) 449 testLogger.Println("GetObjectDetailedMeta:", meta) 450 451 for _, chunk := range chunks { 452 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number), 453 CopySourceIfNoneMatch(meta.Get("Etag"))) 454 c.Assert(err, NotNil) 455 } 456 457 for _, chunk := range chunks { 458 part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number), 459 CopySourceIfMatch(meta.Get("Etag"))) 460 c.Assert(err, IsNil) 461 parts = append(parts, part) 462 } 463 464 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 465 c.Assert(err, IsNil) 466 testLogger.Println("cmur:", cmur) 467 468 err = s.bucket.GetObjectToFile(objectDest, "newpic5.jpg") 469 c.Assert(err, IsNil) 470 471 err = s.bucket.DeleteObject(objectSrc) 472 c.Assert(err, IsNil) 473 err = s.bucket.DeleteObject(objectDest) 474 c.Assert(err, IsNil) 475 } 476 477 // TestMultipartUploadFromFileOutofOrder 478 func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileOutofOrder(c *C) { 479 objectName := objectNamePrefix + RandStr(8) 480 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 481 482 chunks, err := SplitFileByPartSize(fileName, 1024*100) 483 shuffleArray(chunks) 484 c.Assert(err, IsNil) 485 testLogger.Println("chunks:", chunks) 486 487 imur, err := s.bucket.InitiateMultipartUpload(objectName) 488 var parts []UploadPart 489 for _, chunk := range chunks { 490 _, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number)) 491 c.Assert(err, IsNil) 492 } 493 // Double upload 494 for _, chunk := range chunks { 495 part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number)) 496 c.Assert(err, IsNil) 497 parts = append(parts, part) 498 } 499 500 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 501 c.Assert(err, IsNil) 502 testLogger.Println("cmur:", cmur) 503 504 err = s.bucket.GetObjectToFile(objectName, "newpic6.jpg") 505 c.Assert(err, IsNil) 506 507 err = s.bucket.DeleteObject(objectName) 508 c.Assert(err, IsNil) 509 } 510 511 // TestUploadPartCopyOutofOrder 512 func (s *OssBucketMultipartSuite) TestUploadPartCopyOutofOrder(c *C) { 513 objectSrc := objectNamePrefix + RandStr(8) + "-src" 514 objectDest := objectNamePrefix + RandStr(8) + "-dest" 515 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 516 517 chunks, err := SplitFileByPartSize(fileName, 1024*100) 518 shuffleArray(chunks) 519 c.Assert(err, IsNil) 520 testLogger.Println("chunks:", chunks) 521 522 err = s.bucket.PutObjectFromFile(objectSrc, fileName) 523 c.Assert(err, IsNil) 524 525 imur, err := s.bucket.InitiateMultipartUpload(objectDest) 526 var parts []UploadPart 527 for _, chunk := range chunks { 528 _, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number)) 529 c.Assert(err, IsNil) 530 } 531 // Double copy 532 for _, chunk := range chunks { 533 part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number)) 534 c.Assert(err, IsNil) 535 parts = append(parts, part) 536 } 537 538 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 539 c.Assert(err, IsNil) 540 testLogger.Println("cmur:", cmur) 541 542 err = s.bucket.GetObjectToFile(objectDest, "newpic7.jpg") 543 c.Assert(err, IsNil) 544 545 err = s.bucket.DeleteObject(objectSrc) 546 c.Assert(err, IsNil) 547 err = s.bucket.DeleteObject(objectDest) 548 c.Assert(err, IsNil) 549 } 550 551 // TestMultipartUploadFromFileType 552 func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileType(c *C) { 553 objectName := objectNamePrefix + RandStr(8) + ".jpg" 554 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 555 556 chunks, err := SplitFileByPartNum(fileName, 4) 557 c.Assert(err, IsNil) 558 testLogger.Println("chunks:", chunks) 559 560 imur, err := s.bucket.InitiateMultipartUpload(objectName) 561 var parts []UploadPart 562 for _, chunk := range chunks { 563 part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number) 564 c.Assert(err, IsNil) 565 parts = append(parts, part) 566 } 567 568 testLogger.Println("parts:", parts) 569 cmur, err := s.bucket.CompleteMultipartUpload(imur, parts) 570 c.Assert(err, IsNil) 571 testLogger.Println("cmur:", cmur) 572 573 err = s.bucket.GetObjectToFile(objectName, "newpic8.jpg") 574 c.Assert(err, IsNil) 575 576 meta, err := s.bucket.GetObjectDetailedMeta(objectName) 577 c.Assert(err, IsNil) 578 c.Assert(meta.Get("Content-Type"), Equals, "image/jpeg") 579 580 err = s.bucket.DeleteObject(objectName) 581 c.Assert(err, IsNil) 582 } 583 584 func (s *OssBucketMultipartSuite) TestListMultipartUploads(c *C) { 585 objectName := objectNamePrefix + RandStr(8) 586 587 imurs := []InitiateMultipartUploadResult{} 588 for i := 0; i < 20; i++ { 589 imur, err := s.bucket.InitiateMultipartUpload(objectName + strconv.Itoa(i)) 590 c.Assert(err, IsNil) 591 imurs = append(imurs, imur) 592 } 593 594 lmpu, err := s.bucket.ListMultipartUploads() 595 c.Assert(err, IsNil) 596 c.Assert(len(lmpu.Uploads), Equals, 20) 597 598 lmpu, err = s.bucket.ListMultipartUploads(MaxUploads(3)) 599 c.Assert(err, IsNil) 600 c.Assert(len(lmpu.Uploads), Equals, 3) 601 602 lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName)) 603 c.Assert(err, IsNil) 604 c.Assert(len(lmpu.Uploads), Equals, 20) 605 606 lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "1")) 607 c.Assert(err, IsNil) 608 c.Assert(len(lmpu.Uploads), Equals, 11) 609 610 lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "22")) 611 c.Assert(err, IsNil) 612 c.Assert(len(lmpu.Uploads), Equals, 0) 613 614 lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName + "10")) 615 c.Assert(err, IsNil) 616 c.Assert(len(lmpu.Uploads), Equals, 17) 617 618 lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"10"), MaxUploads(3)) 619 c.Assert(err, IsNil) 620 c.Assert(len(lmpu.Uploads), Equals, 3) 621 622 lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName), Delimiter("4")) 623 c.Assert(err, IsNil) 624 c.Assert(len(lmpu.Uploads), Equals, 18) 625 c.Assert(len(lmpu.CommonPrefixes), Equals, 2) 626 627 upLoadIDStr := RandStr(3) 628 lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"12"), UploadIDMarker(upLoadIDStr)) 629 c.Assert(err, IsNil) 630 checkNum := 15 631 for _, im := range imurs { 632 if im.Key == objectName+"12" && im.UploadID > upLoadIDStr { 633 checkNum = 16 634 break 635 } 636 } 637 c.Assert(len(lmpu.Uploads), Equals, checkNum) 638 //testLogger.Println("UploadIDMarker", lmpu.Uploads) 639 640 for _, imur := range imurs { 641 err = s.bucket.AbortMultipartUpload(imur) 642 c.Assert(err, IsNil) 643 } 644 } 645 646 func (s *OssBucketMultipartSuite) TestListMultipartUploadsEncodingKey(c *C) { 647 prefix := objectNamePrefix + "让你任性让你狂" + RandStr(8) 648 649 imurs := []InitiateMultipartUploadResult{} 650 for i := 0; i < 3; i++ { 651 imur, err := s.bucket.InitiateMultipartUpload(prefix + strconv.Itoa(i)) 652 c.Assert(err, IsNil) 653 imurs = append(imurs, imur) 654 } 655 656 lmpu, err := s.bucket.ListMultipartUploads() 657 c.Assert(err, IsNil) 658 c.Assert(len(lmpu.Uploads), Equals, 3) 659 660 lmpu, err = s.bucket.ListMultipartUploads(Prefix(prefix + "1")) 661 c.Assert(err, IsNil) 662 c.Assert(len(lmpu.Uploads), Equals, 1) 663 664 lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(prefix + "1")) 665 c.Assert(err, IsNil) 666 c.Assert(len(lmpu.Uploads), Equals, 1) 667 668 lmpu, err = s.bucket.ListMultipartUploads(EncodingType("url")) 669 c.Assert(err, IsNil) 670 for i, upload := range lmpu.Uploads { 671 c.Assert(upload.Key, Equals, prefix+strconv.Itoa(i)) 672 } 673 674 for _, imur := range imurs { 675 err = s.bucket.AbortMultipartUpload(imur) 676 c.Assert(err, IsNil) 677 } 678 } 679 680 func (s *OssBucketMultipartSuite) TestMultipartNegative(c *C) { 681 objectName := objectNamePrefix + RandStr(8) 682 683 // Key tool long 684 data := make([]byte, 100*1024) 685 imur, err := s.bucket.InitiateMultipartUpload(string(data)) 686 c.Assert(err, NotNil) 687 688 // Invalid imur 689 fileName := "../sample/BingWallpaper-2015-11-07.jpg" 690 fd, err := os.Open(fileName) 691 c.Assert(err, IsNil) 692 defer fd.Close() 693 694 _, err = s.bucket.UploadPart(imur, fd, 1024, 1) 695 c.Assert(err, NotNil) 696 697 _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1) 698 c.Assert(err, NotNil) 699 700 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1) 701 c.Assert(err, NotNil) 702 703 err = s.bucket.AbortMultipartUpload(imur) 704 c.Assert(err, NotNil) 705 706 _, err = s.bucket.ListUploadedParts(imur) 707 c.Assert(err, NotNil) 708 709 // Invalid exist 710 imur, err = s.bucket.InitiateMultipartUpload(objectName) 711 c.Assert(err, IsNil) 712 713 _, err = s.bucket.UploadPart(imur, fd, 1024, 1) 714 c.Assert(err, IsNil) 715 716 _, err = s.bucket.UploadPart(imur, fd, 102400, 10001) 717 c.Assert(err, NotNil) 718 719 // _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1) 720 // c.Assert(err, IsNil) 721 722 _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 102400, 10001) 723 c.Assert(err, NotNil) 724 725 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1) 726 c.Assert(err, NotNil) 727 728 _, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1000) 729 c.Assert(err, NotNil) 730 731 err = s.bucket.AbortMultipartUpload(imur) 732 c.Assert(err, IsNil) 733 734 // Invalid option 735 _, err = s.bucket.InitiateMultipartUpload(objectName, IfModifiedSince(futureDate)) 736 c.Assert(err, IsNil) 737 } 738 739 func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileBigFile(c *C) { 740 objectName := objectNamePrefix + RandStr(8) 741 bigFile := "D:\\tmp\\bigfile.zip" 742 newFile := "D:\\tmp\\newbigfile.zip" 743 744 exist, err := isFileExist(bigFile) 745 c.Assert(err, IsNil) 746 if !exist { 747 return 748 } 749 750 chunks, err := SplitFileByPartNum(bigFile, 64) 751 c.Assert(err, IsNil) 752 testLogger.Println("chunks:", chunks) 753 754 imur, err := s.bucket.InitiateMultipartUpload(objectName) 755 var parts []UploadPart 756 start := GetNowSec() 757 for _, chunk := range chunks { 758 part, err := s.bucket.UploadPartFromFile(imur, bigFile, chunk.Offset, chunk.Size, (int)(chunk.Number)) 759 c.Assert(err, IsNil) 760 parts = append(parts, part) 761 } 762 end := GetNowSec() 763 testLogger.Println("Uplaod big file:", bigFile, "use sec:", end-start) 764 765 testLogger.Println("parts:", parts) 766 _, err = s.bucket.CompleteMultipartUpload(imur, parts) 767 c.Assert(err, IsNil) 768 769 start = GetNowSec() 770 err = s.bucket.GetObjectToFile(objectName, newFile) 771 c.Assert(err, IsNil) 772 end = GetNowSec() 773 testLogger.Println("Download big file:", bigFile, "use sec:", end-start) 774 775 start = GetNowSec() 776 eq, err := compareFiles(bigFile, newFile) 777 c.Assert(err, IsNil) 778 c.Assert(eq, Equals, true) 779 end = GetNowSec() 780 testLogger.Println("Compare big file:", bigFile, "use sec:", end-start) 781 782 err = s.bucket.DeleteObject(objectName) 783 c.Assert(err, IsNil) 784 } 785 786 // TestUploadFile 787 func (s *OssBucketMultipartSuite) TestUploadFile(c *C) { 788 objectName := objectNamePrefix + RandStr(8) 789 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 790 newFile := RandStr(8) + ".jpg" 791 792 // Upload with 100K part size 793 err := s.bucket.UploadFile(objectName, fileName, 100*1024) 794 c.Assert(err, IsNil) 795 796 os.Remove(newFile) 797 err = s.bucket.GetObjectToFile(objectName, newFile) 798 c.Assert(err, IsNil) 799 800 eq, err := compareFiles(fileName, newFile) 801 c.Assert(err, IsNil) 802 c.Assert(eq, Equals, true) 803 804 err = s.bucket.DeleteObject(objectName) 805 c.Assert(err, IsNil) 806 807 // Upload with part size equals to 1/4 of the file size 808 err = s.bucket.UploadFile(objectName, fileName, 482048/4) 809 c.Assert(err, IsNil) 810 811 os.Remove(newFile) 812 err = s.bucket.GetObjectToFile(objectName, newFile) 813 c.Assert(err, IsNil) 814 815 eq, err = compareFiles(fileName, newFile) 816 c.Assert(err, IsNil) 817 c.Assert(eq, Equals, true) 818 819 err = s.bucket.DeleteObject(objectName) 820 c.Assert(err, IsNil) 821 822 // Upload with part size equals to the file size 823 err = s.bucket.UploadFile(objectName, fileName, 482048) 824 c.Assert(err, IsNil) 825 826 os.Remove(newFile) 827 err = s.bucket.GetObjectToFile(objectName, newFile) 828 c.Assert(err, IsNil) 829 830 eq, err = compareFiles(fileName, newFile) 831 c.Assert(err, IsNil) 832 c.Assert(eq, Equals, true) 833 834 err = s.bucket.DeleteObject(objectName) 835 c.Assert(err, IsNil) 836 837 // Upload with part size is bigger than the file size 838 err = s.bucket.UploadFile(objectName, fileName, 482049) 839 c.Assert(err, IsNil) 840 841 os.Remove(newFile) 842 err = s.bucket.GetObjectToFile(objectName, newFile) 843 c.Assert(err, IsNil) 844 845 eq, err = compareFiles(fileName, newFile) 846 c.Assert(err, IsNil) 847 c.Assert(eq, Equals, true) 848 849 err = s.bucket.DeleteObject(objectName) 850 c.Assert(err, IsNil) 851 852 // Option 853 options := []Option{ 854 Expires(futureDate), 855 ObjectACL(ACLPublicRead), 856 Meta("myprop", "mypropval")} 857 err = s.bucket.UploadFile(objectName, fileName, 482049, options...) 858 c.Assert(err, IsNil) 859 860 // Check 861 os.Remove(newFile) 862 err = s.bucket.GetObjectToFile(objectName, newFile) 863 c.Assert(err, IsNil) 864 865 eq, err = compareFiles(fileName, newFile) 866 c.Assert(err, IsNil) 867 c.Assert(eq, Equals, true) 868 869 acl, err := s.bucket.GetObjectACL(objectName) 870 c.Assert(err, IsNil) 871 testLogger.Println("GetObjectAcl:", acl) 872 c.Assert(acl.ACL, Equals, "public-read") 873 874 meta, err := s.bucket.GetObjectDetailedMeta(objectName) 875 c.Assert(err, IsNil) 876 testLogger.Println("GetObjectDetailedMeta:", meta) 877 c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval") 878 } 879 880 func (s *OssBucketMultipartSuite) TestUploadFileNegative(c *C) { 881 objectName := objectNamePrefix + RandStr(8) 882 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 883 884 // Smaller than the required minimal part size (100KB) 885 err := s.bucket.UploadFile(objectName, fileName, 100*1024-1) 886 c.Assert(err, NotNil) 887 888 // Bigger than the max part size (5G) 889 err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*5+1) 890 c.Assert(err, NotNil) 891 892 // File does not exist 893 err = s.bucket.UploadFile(objectName, "/root1/123abc9874", 1024*1024*1024) 894 c.Assert(err, NotNil) 895 896 // Invalid key , key is empty. 897 err = s.bucket.UploadFile("", fileName, 100*1024) 898 c.Assert(err, NotNil) 899 } 900 901 // TestDownloadFile 902 func (s *OssBucketMultipartSuite) TestDownloadFile(c *C) { 903 objectName := objectNamePrefix + RandStr(8) 904 var fileName = "../sample/BingWallpaper-2015-11-07.jpg" 905 newFile := RandStr(8) + ".jpg" 906 907 err := s.bucket.UploadFile(objectName, fileName, 100*1024) 908 c.Assert(err, IsNil) 909 910 // Download file with part size of 100K 911 err = s.bucket.DownloadFile(objectName, newFile, 100*1024) 912 c.Assert(err, IsNil) 913 914 os.Remove(newFile) 915 err = s.bucket.GetObjectToFile(objectName, newFile) 916 c.Assert(err, IsNil) 917 918 eq, err := compareFiles(fileName, newFile) 919 c.Assert(err, IsNil) 920 c.Assert(eq, Equals, true) 921 922 // Download the file with part size equals to 1/4 of the file size 923 err = s.bucket.DownloadFile(objectName, newFile, 482048/4) 924 c.Assert(err, IsNil) 925 926 os.Remove(newFile) 927 err = s.bucket.GetObjectToFile(objectName, newFile) 928 c.Assert(err, IsNil) 929 930 eq, err = compareFiles(fileName, newFile) 931 c.Assert(err, IsNil) 932 c.Assert(eq, Equals, true) 933 934 // Download the file with part size same as the file size 935 err = s.bucket.DownloadFile(objectName, newFile, 482048) 936 c.Assert(err, IsNil) 937 938 os.Remove(newFile) 939 err = s.bucket.GetObjectToFile(objectName, newFile) 940 c.Assert(err, IsNil) 941 942 eq, err = compareFiles(fileName, newFile) 943 c.Assert(err, IsNil) 944 c.Assert(eq, Equals, true) 945 946 // Download the file with part size bigger than the file size 947 err = s.bucket.DownloadFile(objectName, newFile, 482049) 948 c.Assert(err, IsNil) 949 950 os.Remove(newFile) 951 err = s.bucket.GetObjectToFile(objectName, newFile) 952 c.Assert(err, IsNil) 953 954 eq, err = compareFiles(fileName, newFile) 955 c.Assert(err, IsNil) 956 c.Assert(eq, Equals, true) 957 958 // Option 959 meta, err := s.bucket.GetObjectDetailedMeta(objectName) 960 c.Assert(err, IsNil) 961 testLogger.Println("GetObjectDetailedMeta:", meta) 962 963 // If-Match 964 err = s.bucket.DownloadFile(objectName, newFile, 482048/4, IfMatch(meta.Get("Etag"))) 965 c.Assert(err, IsNil) 966 967 os.Remove(newFile) 968 err = s.bucket.GetObjectToFile(objectName, newFile) 969 c.Assert(err, IsNil) 970 971 eq, err = compareFiles(fileName, newFile) 972 c.Assert(err, IsNil) 973 c.Assert(eq, Equals, true) 974 975 // If-None-Match 976 err = s.bucket.DownloadFile(objectName, newFile, 482048, IfNoneMatch(meta.Get("Etag"))) 977 c.Assert(err, NotNil) 978 979 os.Remove(newFile) 980 err = s.bucket.DeleteObject(objectName) 981 c.Assert(err, IsNil) 982 } 983 984 func (s *OssBucketMultipartSuite) TestDownloadFileNegative(c *C) { 985 objectName := objectNamePrefix + RandStr(8) 986 newFile := RandStr(8) + ".jpg" 987 988 // Smaller than the required minimal part size (100KB) 989 err := s.bucket.DownloadFile(objectName, newFile, 100*1024-1) 990 c.Assert(err, NotNil) 991 992 // Bigger than the required max part size (5G) 993 err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024+1) 994 c.Assert(err, NotNil) 995 996 // File does not exist 997 err = s.bucket.DownloadFile(objectName, "/OSS/TEMP/ZIBI/QUQU/BALA", 1024*1024*1024+1) 998 c.Assert(err, NotNil) 999 1000 // Key does not exist 1001 err = s.bucket.DownloadFile(objectName, newFile, 100*1024) 1002 c.Assert(err, NotNil) 1003 } 1004 1005 // Private 1006 func shuffleArray(chunks []FileChunk) []FileChunk { 1007 for i := range chunks { 1008 j := rand.Intn(i + 1) 1009 chunks[i], chunks[j] = chunks[j], chunks[i] 1010 } 1011 return chunks 1012 } 1013 1014 func (s *OssBucketMultipartSuite) TestMultipartUploadWithCallbackResult(c *C) { 1015 objectName := objectNamePrefix + RandStr(8) 1016 content := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" + 1017 "遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。" 1018 1019 imur, err := s.bucket.InitiateMultipartUpload(objectName) 1020 var parts []UploadPart 1021 part, err := s.bucket.UploadPart(imur, strings.NewReader(content), int64(len(content)), 1) 1022 c.Assert(err, IsNil) 1023 parts = append(parts, part) 1024 testLogger.Println("parts:", parts) 1025 1026 callbackMap := map[string]string{} 1027 callbackMap["callbackUrl"] = "www.aliyuncs.com" 1028 callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}" 1029 callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded" 1030 1031 callbackBuffer := bytes.NewBuffer([]byte{}) 1032 callbackEncoder := json.NewEncoder(callbackBuffer) 1033 callbackEncoder.SetEscapeHTML(false) 1034 err = callbackEncoder.Encode(callbackMap) 1035 c.Assert(err, IsNil) 1036 callbackVal := base64.StdEncoding.EncodeToString(callbackBuffer.Bytes()) 1037 var body []byte 1038 _, err = s.bucket.CompleteMultipartUpload(imur, parts, Callback(callbackVal), CallbackResult(&body)) 1039 e, ok := err.(ServiceError) 1040 c.Assert(ok, Equals, true) 1041 c.Assert(e.StatusCode, Equals, 203) 1042 c.Assert(e.Code, Equals, "CallbackFailed") 1043 c.Assert(body, IsNil) 1044 1045 pbody, err := s.bucket.GetObject(objectName) 1046 c.Assert(err, IsNil) 1047 str, err := readBody(pbody) 1048 c.Assert(err, IsNil) 1049 c.Assert(str, Equals, content) 1050 1051 err = s.bucket.DeleteObject(objectName) 1052 c.Assert(err, IsNil) 1053 } 1054 1055 func (s *OssBucketMultipartSuite) TestMultipartUploadNormal(c *C) { 1056 objectName := objectNamePrefix + RandStr(8) 1057 content := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" + 1058 "遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。" 1059 1060 imur, err := s.bucket.InitiateMultipartUpload(objectName) 1061 var parts []UploadPart 1062 part, err := s.bucket.UploadPart(imur, strings.NewReader(content), int64(len(content)), 1) 1063 c.Assert(err, IsNil) 1064 parts = append(parts, part) 1065 testLogger.Println("parts:", parts) 1066 _, err = s.bucket.CompleteMultipartUpload(imur, parts) 1067 c.Assert(err, IsNil) 1068 1069 body, err := s.bucket.GetObject(objectName) 1070 c.Assert(err, IsNil) 1071 str, err := readBody(body) 1072 c.Assert(err, IsNil) 1073 c.Assert(str, Equals, content) 1074 1075 err = s.bucket.DeleteObject(objectName) 1076 c.Assert(err, IsNil) 1077 1078 }