in sdk/OssClient.cs [1555:1615]
public CopyObjectResult ResumableCopyObject(CopyObjectRequest copyObjectRequest, string checkpointDir, long? partSize = null)
{
ThrowIfNullRequest(copyObjectRequest);
// Adjusts part size
long actualPartSize = AdjustPartSize(partSize);
// Gets the file size
var metaRequest = new GetObjectMetadataRequest(copyObjectRequest.SourceBucketName, copyObjectRequest.SourceKey)
{
RequestPayer = copyObjectRequest.RequestPayer,
VersionId = copyObjectRequest.SourceVersionId
};
var objectMeta = GetObjectMetadata(metaRequest);
var fileSize = objectMeta.ContentLength;
if (fileSize <= actualPartSize)
{
return CopyObject(copyObjectRequest);
}
var resumableCopyContext = LoadResumableCopyContext(copyObjectRequest, objectMeta, checkpointDir, actualPartSize);
if (resumableCopyContext.UploadId == null)
{
var initRequest = new InitiateMultipartUploadRequest(copyObjectRequest.DestinationBucketName,
copyObjectRequest.DestinationKey,
copyObjectRequest.NewObjectMetadata)
{
RequestPayer = copyObjectRequest.RequestPayer
};
var initResult = InitiateMultipartUpload(initRequest);
resumableCopyContext.UploadId = initResult.UploadId;
}
// Executes the copy
ResumableCopyWithRetry(copyObjectRequest, resumableCopyContext);
// Completes the copy
var completeRequest = new CompleteMultipartUploadRequest(copyObjectRequest.DestinationBucketName,
copyObjectRequest.DestinationKey, resumableCopyContext.UploadId)
{
RequestPayer = copyObjectRequest.RequestPayer
};
foreach (var part in resumableCopyContext.PartContextList)
{
completeRequest.PartETags.Add(part.PartETag);
}
var result = CompleteMultipartUpload(completeRequest);
resumableCopyContext.Clear();
// Gets the last modified time
metaRequest = new GetObjectMetadataRequest(copyObjectRequest.DestinationBucketName, copyObjectRequest.DestinationKey)
{
RequestPayer = copyObjectRequest.RequestPayer,
VersionId = result.VersionId
};
objectMeta = GetObjectMetadata(metaRequest);
return new CopyObjectResult() { ETag = result.ETag, LastModified = objectMeta.LastModified };
}