public void MultipartUploadPartCopyComplexStepTest()
{
//get target object name
var targetObjectKey = OssTestUtils.GetObjectKey(_className);
var initRequest = new InitiateMultipartUploadRequest(_bucketName, targetObjectKey);
var initResult = _ossClient.InitiateMultipartUpload(initRequest);
// 设置每块为 512K
const int partSize = 1024 * 512 * 1;
var sourceObjectMeta = _ossClient.GetObjectMetadata(_bucketName, _sourceObjectKey);
// 计算分块数目
var partCount = OssTestUtils.CalculatePartCount(sourceObjectMeta.ContentLength, partSize);
LogUtility.LogMessage("Object {0} is splitted to {1} parts for multipart upload part copy",
_sourceObjectKey, partCount);
// 新建一个List保存每个分块上传后的ETag和PartNumber
var partETags = new List<PartETag>();
for (var i = 0; i < partCount; i++)
{
// 跳到每个分块的开头
long skipBytes = partSize * i;
// 计算每个分块的大小
var size = partSize < sourceObjectMeta.ContentLength - skipBytes
? partSize
: sourceObjectMeta.ContentLength - skipBytes;
// 创建UploadPartRequest,上传分块
var uploadPartCopyRequest =
new UploadPartCopyRequest(_bucketName, targetObjectKey, _bucketName, _sourceObjectKey, initResult.UploadId)
{
BeginIndex = skipBytes,
PartSize = size,
PartNumber = (i + 1),
ModifiedSinceConstraint = DateTime.Now.AddDays(-1)
};
uploadPartCopyRequest.MatchingETagConstraints.Add(_objectETag);
var uploadPartCopyResult = _ossClient.UploadPartCopy(uploadPartCopyRequest);
// 将返回的PartETag保存到List中。
partETags.Add(uploadPartCopyResult.PartETag);
}
var lmuRequest = new ListMultipartUploadsRequest(_bucketName);
var lmuListing = _ossClient.ListMultipartUploads(lmuRequest);
string mpUpload = null;
foreach (var t in lmuListing.MultipartUploads)
{
if (t.UploadId == initResult.UploadId)
{
mpUpload = t.UploadId;
break;
}
}
Assert.IsNotNull(mpUpload, "The multipart uploading should be in progress");
var completeRequest = new CompleteMultipartUploadRequest(_bucketName, targetObjectKey, initResult.UploadId);
foreach (var partETag in partETags)
{
completeRequest.PartETags.Add(partETag);
}
_ossClient.CompleteMultipartUpload(completeRequest);
Assert.IsTrue(OssTestUtils.ObjectExists(_ossClient, _bucketName, targetObjectKey));
//delete the object
_ossClient.DeleteObject(_bucketName, targetObjectKey);
}