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); var mpUpload = lmuListing.MultipartUploads.Single(t => t.UploadId == initResult.UploadId); 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); }
public static Task <UploadPartCopyResult> UploadPartCopyAsync(this IOss client, UploadPartCopyRequest request) { return(Task.Factory.FromAsync(client.BeginUploadPartCopy, client.EndUploadPartCopy, request, null)); }