Ejemplo n.º 1
0
 public MultipartTransfer(IObjectClient objectClient, IMultipartClient multipartClient, IMultipartOperations multipartOperations, IEnumerable <IRequestWrapper> requestWrappers)
 {
     _objectClient        = objectClient;
     _multipartClient     = multipartClient;
     _multipartOperations = multipartOperations;
     _requestWrappers     = requestWrappers;
 }
Ejemplo n.º 2
0
        internal Upload(IObjectOperations objectOperations, IMultipartOperations multipartOperations, string bucket, string objectKey)
        {
            _objectOperations    = objectOperations;
            _multipartOperations = multipartOperations;

            _request = new PutObjectRequest(bucket, objectKey, null);
        }
Ejemplo n.º 3
0
 public S3MultipartClient(IMultipartOperations multipartOperations, IObjectOperations objectOperations)
 {
     _objectOperations   = objectOperations;
     MultipartOperations = multipartOperations;
 }
Ejemplo n.º 4
0
 public Transfer(IObjectOperations objectOperations, IMultipartOperations multipartOperations)
 {
     _objectOperations    = objectOperations;
     _multipartOperations = multipartOperations;
 }
Ejemplo n.º 5
0
 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");
                }
            }
        }
Ejemplo n.º 8
0
 public MultipartClient(IMultipartOperations multipartOperations)
 {
     _multipartOperations = multipartOperations;
 }