Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void AsyncUploadParts(String objectName, String fileToUpload,
- String uploadId, int partSize)
- {
- var fi = new FileInfo(fileToUpload);
- var fileSize = fi.Length;
- var partCount = fileSize / partSize;
- if (fileSize % partSize != 0)//count part
- {
- partCount++;
- }
- var ctx = new UploadPartContext()
- {
- ObjectName = objectName,
- UploadId = uploadId,
- TotalParts = partCount,
- CompletedParts = 0,
- SyncLock = new object(),
- PartETags = new List<PartETag>(),
- WaitEvent = new ManualResetEvent(false)
- };
- try
- {
- for (var i = 0; i < partCount; i++)
- {
- var fs = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read, FileShare.Read);
- var skipBytes = (long)partSize * i;
- fs.Seek(skipBytes, 0);
- var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
- var request = new UploadPartRequest(bucketName, objectName, uploadId)
- {
- InputStream = fs,
- PartSize = size,
- PartNumber = i + 1
- };
- client.BeginUploadPart(request, UploadPartCallback, new UploadPartContextWrapper(ctx, fs, i + 1));
- }
- ctx.WaitEvent.WaitOne();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.ToString());
- }
- }
- private void UploadPartCallback(IAsyncResult ar)
- {
- try
- {
- var result = client.EndUploadPart(ar);
- var wrappedContext = (UploadPartContextWrapper)ar.AsyncState;
- wrappedContext.PartStream.Close();
- var ctx = wrappedContext.Context;
- lock (ctx.SyncLock)
- {
- var partETags = ctx.PartETags;
- partETags.Add(new PartETag(wrappedContext.PartNumber, result.ETag));
- ctx.CompletedParts++;
- Console.WriteLine("finish {0}/{1}", ctx.CompletedParts, ctx.TotalParts);
- if (ctx.CompletedParts == ctx.TotalParts)
- {
- partETags.Sort((e1, e2) => (e1.PartNumber - e2.PartNumber));
- var completeMultipartUploadRequest =
- new CompleteMultipartUploadRequest(ctx.BucketName, ctx.ObjectName, ctx.UploadId);
- foreach (var partETag in partETags)
- {
- completeMultipartUploadRequest.PartETags.Add(partETag);
- }
- var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest);
- Console.WriteLine(@"Async upload multipart result : " + completeMultipartUploadResult.Location);
- }//complete
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.ToString());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement