public MultipartTransfer(IObjectClient objectClient, IMultipartClient multipartClient, IMultipartOperations multipartOperations, IEnumerable <IRequestWrapper> requestWrappers) { _objectClient = objectClient; _multipartClient = multipartClient; _multipartOperations = multipartOperations; _requestWrappers = requestWrappers; }
internal Upload(IObjectOperations objectOperations, IMultipartOperations multipartOperations, string bucket, string objectKey) { _objectOperations = objectOperations; _multipartOperations = multipartOperations; _request = new PutObjectRequest(bucket, objectKey, null); }
public S3MultipartClient(IMultipartOperations multipartOperations, IObjectOperations objectOperations) { _objectOperations = objectOperations; MultipartOperations = multipartOperations; }
public Transfer(IObjectOperations objectOperations, IMultipartOperations multipartOperations) { _objectOperations = objectOperations; _multipartOperations = multipartOperations; }
public PooledMultipartClient(IMultipartOperations multipartOperations) { MultipartOperations = multipartOperations; }
private static async Task UploadPartAsync(TaskCompletionSource <UploadPartResponse> completionSource, IMultipartOperations operations, string bucketName, string objectKey, byte[] data, int length, int partNumber, string uploadId, SemaphoreSlim semaphore, CancellationToken token) { try { using (MemoryStream ms = new MemoryStream(data, 0, length)) { UploadPartResponse result = await operations.UploadPartAsync(new UploadPartRequest(bucketName, objectKey, partNumber, uploadId, ms), token) .ConfigureAwait(false); completionSource.SetResult(result); } } catch (Exception ex) { completionSource.SetException(ex); } finally { semaphore.Release(); } }
public static async IAsyncEnumerable <UploadPartResponse> MultipartUploadAsync(this IMultipartOperations operations, CreateMultipartUploadRequest req, Stream data, int partSize = 16777216, int numParallelParts = 4, [EnumeratorCancellation] CancellationToken token = default) { Validator.RequireNotNull(req, nameof(req)); Validator.RequireNotNull(data, nameof(data)); foreach (IRequestWrapper wrapper in operations.RequestWrappers) { if (wrapper.IsSupported(req)) { data = wrapper.Wrap(data, req); } } string bucket = req.BucketName; string objectKey = req.ObjectKey; CreateMultipartUploadResponse initResp = await operations.CreateMultipartUploadAsync(req, token).ConfigureAwait(false); if (token.IsCancellationRequested) { yield break; } if (!initResp.IsSuccess) { throw new S3RequestException(initResp.StatusCode, "CreateMultipartUploadRequest was unsuccessful"); } Queue <Task <UploadPartResponse> > uploads = new Queue <Task <UploadPartResponse> >(); using (SemaphoreSlim semaphore = new SemaphoreSlim(numParallelParts)) { long offset = 0; for (int i = 1; offset < data.Length; i++) { await semaphore.WaitAsync(token).ConfigureAwait(false); if (token.IsCancellationRequested) { break; } byte[] partData = new byte[partSize]; int read = await data.ReadUpToAsync(partData, 0, partData.Length, token).ConfigureAwait(false); TaskCompletionSource <UploadPartResponse> completionSource = new TaskCompletionSource <UploadPartResponse>(); uploads.Enqueue(completionSource.Task); UploadPartAsync(completionSource, operations, bucket, objectKey, partData, read, i, initResp.UploadId, semaphore, token); offset += partSize; } Queue <UploadPartResponse> responses = new Queue <UploadPartResponse>(uploads.Count); while (uploads.TryDequeue(out Task <UploadPartResponse>?task)) { if (token.IsCancellationRequested) { yield break; } UploadPartResponse response = await task !.ConfigureAwait(false); responses.Enqueue(response); yield return(response); } CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucket, objectKey, initResp.UploadId, responses); CompleteMultipartUploadResponse completeResp = await operations.CompleteMultipartUploadAsync(completeReq, token).ConfigureAwait(false); if (!completeResp.IsSuccess) { throw new S3RequestException(completeResp.StatusCode, "CompleteMultipartUploadRequest was unsuccessful"); } } }
public MultipartClient(IMultipartOperations multipartOperations) { _multipartOperations = multipartOperations; }