yubin.byb 9 年之前
父节点
当前提交
e917785cde
共有 4 个文件被更改,包括 91 次插入53 次删除
  1. 21 7
      oss/bucket.go
  2. 35 4
      oss/bucket_test.go
  3. 6 5
      oss/multicopy.go
  4. 29 37
      oss/multicopy_test.go

+ 21 - 7
oss/bucket.go

@@ -142,25 +142,39 @@ func (bucket Bucket) CopyObject(srcObjectKey, destObjectKey string, options ...O
 //
 // CopyObjectTo bucket间拷贝object。
 //
-// srcBucketName  Copy的源Bucket。
-// srcObjectKey   Copy的源对象。
-// destBucket     Copy的目标Bucket。
-// destObjectKey  Copy的目标Object。
+// srcObjectKey   源Object名称。源Bucket名称为Bucket.BucketName。
+// destBucketName  目标Bucket名称。
+// destObjectKey  目标Object名称。
 // options        Copy选项,详见CopyObject的options。
 //
 // error  操作无错误为nil,非nil为错误信息。
 //
-func (bucket Bucket) CopyObjectTo(srcBucketName, srcObjectKey, destBucketName, destObjectKey string, options ...Option) (CopyObjectResult, error) {
+func (bucket Bucket) CopyObjectTo(destBucketName, destObjectKey, srcObjectKey string, options ...Option) (CopyObjectResult, error) {
+	return bucket.copy(srcObjectKey, destBucketName, destObjectKey, options...)
+}
+
+//
+// CopyObjectFrom bucket间拷贝object。
+//
+// srcBucketName  源Bucket名称。
+// srcObjectKey   源Object名称。
+// destObjectKey  目标Object名称。目标Bucket名称为Bucket.BucketName。
+// options        Copy选项,详见CopyObject的options。
+//
+// error  操作无错误为nil,非nil为错误信息。
+//
+func (bucket Bucket) CopyObjectFrom(srcBucketName, srcObjectKey, destObjectKey string, options ...Option) (CopyObjectResult, error) {
+	destBucketName := bucket.BucketName
 	var out CopyObjectResult
 	srcBucket, err := bucket.Client.Bucket(srcBucketName)
 	if err != nil {
 		return out, err
 	}
 
-	return srcBucket.copyObjectTo(srcObjectKey, destBucketName, destObjectKey, options...);
+	return srcBucket.copy(srcObjectKey, destBucketName, destObjectKey, options...);
 }
 
-func (bucket Bucket) copyObjectTo(srcObjectKey, destBucketName, destObjectKey string, options ...Option) (CopyObjectResult, error) {
+func (bucket Bucket) copy(srcObjectKey, destBucketName, destObjectKey string, options ...Option) (CopyObjectResult, error) {
 	var out CopyObjectResult
 	options = append(options, CopySource(bucket.BucketName, srcObjectKey))
 	headers := make(map[string]string)

+ 35 - 4
oss/bucket_test.go

@@ -1128,8 +1128,9 @@ func (s *OssBucketSuite) TestCopyObject(c *C) {
 	c.Assert(err, IsNil)
 }
 
-func (s *OssBucketSuite) TestCopyObjectToBucket(c *C) {
-	objectName := objectNamePrefix + "tcotb"
+// TestCopyObjectToOrFrom
+func (s *OssBucketSuite) TestCopyObjectToOrFrom(c *C) {
+	objectName := objectNamePrefix + "tcotof"
 	objectValue := "男儿何不带吴钩,收取关山五十州。请君暂上凌烟阁,若个书生万户侯?"
 	destBucket := bucketName + "-dest"
 	objectNameDest := objectName + "dest"
@@ -1143,8 +1144,8 @@ func (s *OssBucketSuite) TestCopyObjectToBucket(c *C) {
 	err = s.bucket.PutObject(objectName, strings.NewReader(objectValue))
 	c.Assert(err, IsNil)
 
-	// copy
-	_, err = s.bucket.CopyObjectTo(bucketName, objectName, destBucket, objectNameDest)
+	// copy from
+	_, err = destBuck.CopyObjectFrom(bucketName, objectName, objectNameDest)
 	c.Assert(err, IsNil)
 
 	// check
@@ -1154,6 +1155,21 @@ func (s *OssBucketSuite) TestCopyObjectToBucket(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(str, Equals, objectValue)
 
+	err = s.bucket.DeleteObject(objectName)
+	c.Assert(err, IsNil)
+
+	// copy to
+	_, err = destBuck.CopyObjectTo(bucketName, objectName, objectNameDest)
+	c.Assert(err, IsNil)
+
+	// check
+	body, err = s.bucket.GetObject(objectName)
+	c.Assert(err, IsNil)
+	str, err = readBody(body)
+	c.Assert(err, IsNil)
+	c.Assert(str, Equals, objectValue)
+
+	// clean
 	err = destBuck.DeleteObject(objectNameDest)
 	c.Assert(err, IsNil)
 
@@ -1164,6 +1180,21 @@ func (s *OssBucketSuite) TestCopyObjectToBucket(c *C) {
 	c.Assert(err, IsNil)
 }
 
+// TestCopyObjectToOrFromNegative
+func (s *OssBucketSuite) TestCopyObjectToOrFromNegative(c *C) {
+	objectName := objectNamePrefix + "tcotofn"
+	destBucket := bucketName + "-dest"
+	objectNameDest := objectName + "dest"
+
+	// object no exist
+	_, err := s.bucket.CopyObjectTo(bucketName, objectName, objectNameDest)
+	c.Assert(err, NotNil)
+
+	// bucket no exist
+	_, err = s.bucket.CopyObjectFrom(destBucket, objectNameDest, objectName)
+	c.Assert(err, NotNil)
+}
+
 // TestAppendObject
 func (s *OssBucketSuite) TestAppendObject(c *C) {
 	objectName := objectNamePrefix + "tao"

+ 6 - 5
oss/multicopy.go

@@ -14,15 +14,16 @@ import (
 //
 // CopyFile 分片复制文件
 //
-// objectKey  object key。
-// filePath   本地文件。objectKey下载到文件。
-// partSize   本次上传文件片的大小,字节数。比如100 * 1024为每片100KB。
+// srcBucketName  源Bucket名称。
+// srcObjectKey   源Object名称。
+// destObjectKey   目标Object名称。目标Bucket名称为Bucket.BucketName。
+// partSize   复制文件片的大小,字节数。比如100 * 1024为每片100KB。
 // options    Object的属性限制项。详见InitiateMultipartUpload。
 //
 // error 操作成功error为nil,非nil为错误信息。
 //
-func (bucket Bucket) CopyFile(srcBucketName, srcObjectKey, destBucketName, destObjectKey string, 
-	partSize int64, options ...Option) error {
+func (bucket Bucket) CopyFile(srcBucketName, srcObjectKey, destObjectKey string, partSize int64, options ...Option) error {
+	destBucketName := bucket.BucketName
 	if partSize < MinPartSize || partSize > MaxPartSize {
 		return errors.New("oss: part size invalid range (1024KB, 5GB]")
 	}

+ 29 - 37
oss/multicopy_test.go

@@ -72,7 +72,7 @@ func (s *OssCopySuite) TearDownTest(c *C) {
 }
 
 // TestCopyRoutineWithoutRecovery 多线程无断点恢复的复制
-func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
+func (s *OssCopySuite) TestCopyRoutineWithoutRecovery(c *C) {
 	srcObjectName := objectNamePrefix + "tcrwr"
 	destObjectName := srcObjectName + "-copy" 
 	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
@@ -84,7 +84,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 不指定Routines,默认单线程
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024)
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024)
 	c.Assert(err, IsNil)
 	
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -99,7 +99,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 指定线程数1
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(1))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(1))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -114,7 +114,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 指定线程数3,小于分片数5
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(3))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(3))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -129,7 +129,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 指定线程数5,等于分片数
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(5))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(5))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -144,7 +144,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 指定线程数10,大于分片数5
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(10))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(10))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -159,7 +159,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 线程值无效自动变成1
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(-1))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(-1))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -174,7 +174,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecovery(c *C) {
 	os.Remove(newFile)
 
 	// option
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(3), Meta("myprop", "mypropval"))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(3), Meta("myprop", "mypropval"))
 
 	meta, err := s.bucket.GetObjectDetailedMeta(destObjectName)
 	c.Assert(err, IsNil)
@@ -206,7 +206,7 @@ func CopyErrorHooker(part copyPart) error {
 
 
 // TestCopyRoutineWithoutRecoveryNegative 多线程无断点恢复的复制
-func (s *OssCopySuite) _TestCopyRoutineWithoutRecoveryNegative(c *C) {
+func (s *OssCopySuite) TestCopyRoutineWithoutRecoveryNegative(c *C) {
 	srcObjectName := objectNamePrefix + "tcrwrn"
 	destObjectName := srcObjectName + "-copy" 
 	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
@@ -217,28 +217,24 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecoveryNegative(c *C) {
 
 	copyPartHooker = CopyErrorHooker
 	// worker线程错误
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 100*1024, Routines(2))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(2))
 
 	c.Assert(err, NotNil)
 	c.Assert(err.Error(), Equals, "ErrorHooker")
 	copyPartHooker = defaultCopyPartHook
 
-	// 目标Bucket不存在
-	err = s.bucket.CopyFile(bucketName, srcObjectName, "NotExist", destObjectName, 100*1024, Routines(2))
-	c.Assert(err, NotNil)
-
 	// 源Bucket不存在
-	err = s.bucket.CopyFile("NotExist", srcObjectName, bucketName, destObjectName, 100*1024, Routines(2))
+	err = s.bucket.CopyFile("NotExist", srcObjectName, destObjectName, 100*1024, Routines(2))
 	c.Assert(err, NotNil)
 
 	// 源Object不存在
-	err = s.bucket.CopyFile(bucketName, "NotExist", bucketName, destObjectName, 100*1024, Routines(2))
+	err = s.bucket.CopyFile(bucketName, "NotExist", destObjectName, 100*1024, Routines(2))
 
 	// 指定的分片大小无效
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024, Routines(2))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024, Routines(2))
 	c.Assert(err, NotNil)
 
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*1024*1024*100, Routines(2))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*1024*1024*100, Routines(2))
 	c.Assert(err, NotNil)
 
 	// 删除源文件
@@ -247,7 +243,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithoutRecoveryNegative(c *C) {
 }
 
 // TestCopyRoutineWithRecovery 多线程且有断点恢复的复制
-func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
+func (s *OssCopySuite) TestCopyRoutineWithRecovery(c *C) {
 	srcObjectName := objectNamePrefix + "tcrtr"
 	destObjectName := srcObjectName + "-copy" 
 	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
@@ -261,7 +257,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	// Routines默认值,CP开启默认路径是destObjectName+.cp
 	// 第一次上传,上传4片
 	copyPartHooker = CopyErrorHooker
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Checkpoint(true, ""))
 	c.Assert(err, NotNil)
 	c.Assert(err.Error(), Equals, "ErrorHooker")
 	copyPartHooker = defaultCopyPartHook
@@ -285,7 +281,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	c.Assert(ccp.PartStat[4], Equals, false)
 
 	// 第二次上传,完成剩余的一片
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Checkpoint(true, ""))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -304,7 +300,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 
 	// Routines指定,CP指定
 	copyPartHooker = CopyErrorHooker
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Routines(2), Checkpoint(true, srcObjectName+".cp"))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(2), Checkpoint(true, srcObjectName+".cp"))
 	c.Assert(err, NotNil)
 	c.Assert(err.Error(), Equals, "ErrorHooker")
 	copyPartHooker = defaultCopyPartHook
@@ -328,7 +324,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	c.Assert(ccp.PartStat[4], Equals, false)
 
 	// 第二次上传,完成剩余的一片
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Routines(2), Checkpoint(true, srcObjectName+".cp"))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(2), Checkpoint(true, srcObjectName+".cp"))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -346,7 +342,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	c.Assert(err, NotNil)
 
 	// 一次完成上传,中间没有错误
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Routines(3), Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(3), Checkpoint(true, ""))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -361,7 +357,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	os.Remove(newFile)
 
 	// 用多协程下载,中间没有错误
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Routines(10), Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(10), Checkpoint(true, ""))
 	c.Assert(err, IsNil)
 
 	err = s.bucket.GetObjectToFile(destObjectName, newFile)
@@ -376,7 +372,7 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 	os.Remove(newFile)
 
 	// option
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*100, Routines(5), Checkpoint(true, ""), Meta("myprop", "mypropval"))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(5), Checkpoint(true, ""), Meta("myprop", "mypropval"))
 	c.Assert(err, IsNil)
 
 	meta, err := s.bucket.GetObjectDetailedMeta(destObjectName)
@@ -400,28 +396,24 @@ func (s *OssCopySuite) _TestCopyRoutineWithRecovery(c *C) {
 }
 
 // TestCopyRoutineWithRecoveryNegative 多线程无断点恢复的复制
-func (s *OssCopySuite) _TestCopyRoutineWithRecoveryNegative(c *C) {
+func (s *OssCopySuite) TestCopyRoutineWithRecoveryNegative(c *C) {
 	srcObjectName := objectNamePrefix + "tcrwrn"
 	destObjectName := srcObjectName + "-copy" 
 
-	// 目标Bucket不存在
-	err := s.bucket.CopyFile(bucketName, srcObjectName, "NotExist", destObjectName, 100*1024, Checkpoint(true, ""))
-	c.Assert(err, NotNil)
-
 	// 源Bucket不存在
-	err = s.bucket.CopyFile("NotExist", srcObjectName, bucketName, destObjectName, 100*1024, Checkpoint(true, ""))
+	err := s.bucket.CopyFile("NotExist", srcObjectName, destObjectName, 100*1024, Checkpoint(true, ""))
 	c.Assert(err, NotNil)
 	c.Assert(err, NotNil)
 
 	// 源Object不存在
-	err = s.bucket.CopyFile(bucketName, "NotExist", bucketName, destObjectName, 100*1024, Routines(2), Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, "NotExist", destObjectName, 100*1024, Routines(2), Checkpoint(true, ""))
 	c.Assert(err, NotNil)
 
 	// 指定的分片大小无效
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024,  Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024,  Checkpoint(true, ""))
 	c.Assert(err, NotNil)
 
-	err = s.bucket.CopyFile(bucketName, srcObjectName, bucketName, destObjectName, 1024*1024*1024*100, Routines(2), Checkpoint(true, ""))
+	err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*1024*1024*100, Routines(2), Checkpoint(true, ""))
 	c.Assert(err, NotNil)
 }
 
@@ -446,7 +438,7 @@ func (s *OssCopySuite) TestCopyFileCrossBucket(c *C) {
 	os.Remove(newFile)
 	
 	// 复制文件
-	err = destBucket.CopyFile(bucketName, srcObjectName, destBucketName, destObjectName, 1024*100, Routines(5), Checkpoint(true, ""))
+	err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(5), Checkpoint(true, ""))
 	c.Assert(err, IsNil)
 
 	err = destBucket.GetObjectToFile(destObjectName, newFile)
@@ -461,7 +453,7 @@ func (s *OssCopySuite) TestCopyFileCrossBucket(c *C) {
 	os.Remove(newFile)
 
 	// 带option的复制
-	err = destBucket.CopyFile(bucketName, srcObjectName, destBucketName, destObjectName, 1024*100, Routines(10), Checkpoint(true, "copy.cp"), Meta("myprop", "mypropval"))
+	err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(10), Checkpoint(true, "copy.cp"), Meta("myprop", "mypropval"))
 	c.Assert(err, IsNil)
 
 	err = destBucket.GetObjectToFile(destObjectName, newFile)