private static List <PartETag> UploadParts ( OssClient client, string bucketName, string objectName, string fileToUpload, string uploadId, int partSize, EventHandler <StreamTransferProgressArgs> streamTransferProgress, CancellationToken cancellationToken = default(CancellationToken) ) { var fileSize = new FileInfo(fileToUpload).Length; long progressUpdateInterval = (fileSize / 100 + 4096) / 4096 * 4096; MultipartStreamProgressMonitor progressMonitor = null; if (streamTransferProgress != null) { progressMonitor = new MultipartStreamProgressMonitor(); progressMonitor.StreamTransferProgress += streamTransferProgress; progressMonitor.TotalBytes = fileSize; #if DEBUG progressMonitor.ShowProgressOnConsole = OutputDebugInfo; #endif } var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } var partETags = new List <PartETag>(); using (var fs = File.Open(fileToUpload, FileMode.Open, FileAccess.Read, FileShare.Read)) { for (var i = 0; i < partCount; i++) { cancellationToken.ThrowIfCancellationRequested(); var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); string md5 = null; using (MD5 md5Hash = MD5.Create()) using (var md5stream = new PartialFileStream(fileToUpload, FileMode.Open, FileAccess.Read, FileShare.Read, skipBytes, size)) { md5 = Convert.ToBase64String(md5Hash.ComputeHash(md5stream)); } Retry((_) => { fs.Seek(skipBytes, 0); var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = fs, Md5Digest = md5, PartSize = size, PartNumber = i + 1 }; if (progressMonitor != null) { request.StreamTransferProgress += (s, e) => progressMonitor.PartStreamTransferProgress(i, e); } var result = client.UploadPart(request); partETags.Add(result.PartETag); }, cancellationToken: cancellationToken); #if DEBUG if (OutputDebugInfo) { Console.WriteLine("finish {0}/{1}", partETags.Count, partCount); } #endif } } return(partETags); }
private static List <PartETag> UploadPartsWithCache ( OssClient client, string bucketName, string objectName, Stream streamToUpload, string uploadId, int partSize, EventHandler <StreamTransferProgressArgs> streamTransferProgress, CancellationToken cancellationToken = default(CancellationToken) ) { long fileSize = streamToUpload.Length; MultipartStreamProgressMonitor progressMonitor = null; if (streamTransferProgress != null) { progressMonitor = new MultipartStreamProgressMonitor(); progressMonitor.StreamTransferProgress += streamTransferProgress; progressMonitor.TotalBytes = fileSize; #if DEBUG progressMonitor.ShowProgressOnConsole = OutputDebugInfo; #endif } byte[] buffer = new byte[partSize]; var partETags = new List <PartETag>(); for (int i = 0; /* part count is unknown */; i++) { cancellationToken.ThrowIfCancellationRequested(); using (var ms = new MemoryStream()) { int readSize = streamToUpload.Read(buffer, 0, partSize); if (readSize == 0) { break; } string md5 = HashUtility.CalulateHash_MD5(buffer, 0, readSize); Retry((_) => { var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = new MemoryStream(buffer, 0, readSize), Md5Digest = md5, PartSize = readSize, PartNumber = i + 1 }; if (progressMonitor != null) { request.StreamTransferProgress += (s, e) => progressMonitor.PartStreamTransferProgress(i, e); } var result = client.UploadPart(request); partETags.Add(result.PartETag); }, cancellationToken: cancellationToken); if (readSize < partSize) { break; } } #if DEBUG if (OutputDebugInfo) { Console.WriteLine("finish {0} parts", partETags.Count); } #endif } return(partETags); }
private static List <PartETag> UploadParts ( OssClient client, string bucketName, string objectName, Stream streamToUpload, string uploadId, int partSize, EventHandler <StreamTransferProgressArgs> streamTransferProgress, CancellationToken cancellationToken = default(CancellationToken) ) { long fileSize = streamToUpload.Length; MultipartStreamProgressMonitor progressMonitor = null; if (streamTransferProgress != null) { progressMonitor = new MultipartStreamProgressMonitor(); progressMonitor.StreamTransferProgress += streamTransferProgress; progressMonitor.TotalBytes = fileSize; #if DEBUG progressMonitor.ShowProgressOnConsole = OutputDebugInfo; #endif } var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } var partETags = new List <PartETag>(); for (var i = 0; i < partCount; i++) { cancellationToken.ThrowIfCancellationRequested(); var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); string md5 = HashUtility.CalulateHash_MD5(streamToUpload, skipBytes, size); Retry((_) => { streamToUpload.Seek(skipBytes, 0); var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = streamToUpload, Md5Digest = md5, PartSize = size, PartNumber = i + 1 }; if (progressMonitor != null) { request.StreamTransferProgress += (s, e) => progressMonitor.PartStreamTransferProgress(i, e); } var result = client.UploadPart(request); partETags.Add(result.PartETag); }, cancellationToken: cancellationToken); #if DEBUG if (OutputDebugInfo) { Console.WriteLine("finish {0}/{1}", partETags.Count, partCount); } #endif } return(partETags); }