in sdk/OssClient.cs [1406:1481]
public ObjectMetadata ResumableDownloadObject(DownloadObjectRequest request)
{
ThrowIfNullRequest(request);
ThrowIfNullRequest(request.BucketName);
ThrowIfNullRequest(request.Key);
ThrowIfNullRequest(request.DownloadFile);
if (!Directory.GetParent(request.DownloadFile).Exists)
{
throw new ArgumentException(String.Format("Invalid file path {0}. The parent folder does not exist.", request.DownloadFile));
}
var metaRequest = new GetObjectMetadataRequest(request.BucketName, request.Key)
{
RequestPayer = request.RequestPayer,
VersionId = request.VersionId
};
ObjectMetadata objectMeta = this.GetObjectMetadata(metaRequest);
var fileSize = objectMeta.ContentLength;
// Adjusts part size
long actualPartSize = AdjustPartSize(request.PartSize);
var config = OssUtils.GetClientConfiguration(_serviceClient);
if (fileSize <= actualPartSize)
{
using (Stream fs = File.Open(request.DownloadFile, FileMode.Create))
{
using (var ossObject = GetObject(request.ToGetObjectRequest()))
{
var streamWrapper = ossObject.Content;
try
{
if (config.EnalbeMD5Check && !string.IsNullOrEmpty(objectMeta.ContentMd5))
{
byte[] expectedHashDigest = Convert.FromBase64String(objectMeta.ContentMd5); ;
streamWrapper = new MD5Stream(ossObject.Content, expectedHashDigest, fileSize);
}
else if (config.EnableCrcCheck && !string.IsNullOrEmpty(objectMeta.Crc64))
{
ulong crcVal = 0;
if (UInt64.TryParse(objectMeta.Crc64, out crcVal))
{
byte[] expectedHashDigest = BitConverter.GetBytes(crcVal);
streamWrapper = new Crc64Stream(ossObject.Content, expectedHashDigest, fileSize);
}
}
if (request.StreamTransferProgress != null)
{
streamWrapper = this.SetupProgressListeners(streamWrapper,
objectMeta.ContentLength,
0,
config.ProgressUpdateInterval,
request.StreamTransferProgress);
}
ResumableDownloadManager.WriteTo(streamWrapper, fs);
}
finally
{
if (!Object.Equals(streamWrapper, fs))
{
streamWrapper.Dispose();
}
}
}
}
return objectMeta;
}
ResumableDownloadContext resumableContext = this.LoadResumableDownloadContext(request.BucketName, request.Key, request.VersionId, objectMeta, request.CheckpointDir, actualPartSize);
ResumableDownloadManager resumableDownloadManager = new ResumableDownloadManager(this, ((RetryableServiceClient)_serviceClient).MaxRetryTimes, config);
resumableDownloadManager.ResumableDownloadWithRetry(request, resumableContext);
resumableContext.Clear();
return objectMeta;
}