in sdk/OssClient.cs [1123:1228]
public PutObjectResult ResumableUploadObject(UploadObjectRequest request)
{
ThrowIfNullRequest(request);
ThrowIfNullRequest(request.BucketName);
ThrowIfNullRequest(request.Key);
if (string.IsNullOrEmpty(request.UploadFile) && request.UploadStream == null)
{
throw new ArgumentException("Parameter request.UploadFile or request.UploadStream must not be null.");
}
if (request.UploadStream != null && !request.UploadStream.CanSeek)
{
throw new ArgumentException("Parameter request.UploadStream must be seekable---for nonseekable stream, please call UploadObject instead.");
}
// calculates content-type
if (request.Metadata == null)
{
request.Metadata = new ObjectMetadata();
}
ObjectMetadata metadata = request.Metadata;
SetContentTypeIfNull(request.Key, null, ref metadata);
// Adjust part size
long actualPartSize = AdjustPartSize(request.PartSize);
// If the file size is less than the part size, upload it directly.
long fileSize = 0;
Stream uploadSteam = null;
if (request.UploadStream != null)
{
fileSize = request.UploadStream.Length;
uploadSteam = request.UploadStream;
}
else
{
fileSize = new System.IO.FileInfo(request.UploadFile).Length;
uploadSteam = new FileStream(request.UploadFile, FileMode.Open, FileAccess.Read, FileShare.Read);
}
if (fileSize <= actualPartSize)
{
try
{
var putObjectRequest = new PutObjectRequest(request.BucketName, request.Key, uploadSteam, metadata)
{
StreamTransferProgress = request.StreamTransferProgress,
RequestPayer = request.RequestPayer,
TrafficLimit = request.TrafficLimit
};
return PutObject(putObjectRequest);
}
finally
{
uploadSteam.Dispose();
}
}
var resumableContext = LoadResumableUploadContext(request.BucketName, request.Key, uploadSteam,
request.CheckpointDir, actualPartSize);
if (resumableContext.UploadId == null)
{
var initRequest = new InitiateMultipartUploadRequest(request.BucketName, request.Key, metadata)
{
RequestPayer = request.RequestPayer
};
var initResult = InitiateMultipartUpload(initRequest);
resumableContext.UploadId = initResult.UploadId;
}
int maxRetry = ((RetryableServiceClient)_serviceClient).MaxRetryTimes;
ClientConfiguration config = OssUtils.GetClientConfiguration(_serviceClient);
ResumableUploadManager uploadManager = new ResumableUploadManager(this, maxRetry, config);
uploadManager.ResumableUploadWithRetry(request, resumableContext);
// Completes the upload
var completeRequest = new CompleteMultipartUploadRequest(request.BucketName, request.Key, resumableContext.UploadId)
{
RequestPayer = request.RequestPayer
};
if (metadata.HttpMetadata.ContainsKey(HttpHeaders.Callback))
{
var callbackMetadata = new ObjectMetadata();
callbackMetadata.AddHeader(HttpHeaders.Callback, metadata.HttpMetadata[HttpHeaders.Callback]);
completeRequest.Metadata = callbackMetadata;
}
foreach (var part in resumableContext.PartContextList)
{
if (part == null || !part.IsCompleted)
{
throw new OssException("Not all parts are completed.");
}
completeRequest.PartETags.Add(part.PartETag);
}
PutObjectResult result = CompleteMultipartUpload(completeRequest);
resumableContext.Clear();
return result;
}