Example #1
0
        /// <summary>
        /// Uploads a large file in chunked parts.
        /// </summary>
        /// <param name="request">The <see cref="UploadFileRequest"/> content to send.</param>
        /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
        /// <param name="cancellationToken">The cancellation token to cancel operation.</param>
        private async Task <IApiResults <UploadFileResponse> > UploadLargeFileAsync
            (UploadLargeFileRequest request, IProgress <ICopyProgress> progress, CancellationToken cancellationToken)
        {
            if (request.ContentLength < ClientOptions.MinimumPartSize)
            {
                throw new ArgumentOutOfRangeException($"Argument must be a minimum of {ClientOptions.MinimumPartSize} bytes long.", nameof(request.ContentLength));
            }

            List <string> sha1Hash = new List <string>();

            var parts = GetStreamParts(request.ContentStream, Options.UploadPartSize);

            if (parts.Count == 0)
            {
                throw new ApiException($"The number of large file parts could not be determined from stream.");
            }

            var fileRequest = new StartLargeFileRequest(request.BucketId, request.FileName)
            {
                ContentType = request.ContentType,
                FileInfo    = request.FileInfo
            };

            fileRequest.FileInfo.SetLargeFileSha1(request.ContentStream.ToSha1());

            var fileResults = await StartLargeFileAsync(fileRequest, cancellationToken).ConfigureAwait(false);

            if (fileResults.IsSuccessStatusCode)
            {
                var urlRequest = new GetUploadPartUrlRequest(fileResults.Response.FileId);
                var urlResults = await GetUploadPartUrlAsync(urlRequest, default, cancellationToken).ConfigureAwait(false);
Example #2
0
        /// <summary>
        /// Uploads content by bucket id.
        /// </summary>
        /// <param name="request">The upload file request content to send.</param>
        /// <param name="content">The upload content to receive.</param>
        /// <param name="progress">A progress action which fires every time the write buffer is cycled.</param>
        /// <param name="cancel">The cancellation token to cancel operation.</param>
        public async Task <IApiResults <UploadFileResponse> > UploadAsync
            (UploadFileByBucketIdRequest request, Stream content, IProgress <ICopyProgress> progress, CancellationToken cancel)
        {
            return(await _policy.InvokeUpload.ExecuteAsync(async() =>
            {
                if (content.Length < Options.UploadCutoffSize)
                {
                    var urlRequest = new GetUploadUrlRequest(request.BucketId);
                    var urlResults = await GetUploadUrlAsync(urlRequest, cancel).ConfigureAwait(false);

                    if (urlResults.IsSuccessStatusCode)
                    {
                        var response = urlResults.Response;
                        var fileRequest = new UploadFileRequest(response.UploadUrl, request.FileName, response.AuthorizationToken)
                        {
                            ContentType = request.ContentType,
                            FileInfo = request.FileInfo
                        };

                        return await UploadFileAsync(fileRequest, content, progress, cancel).ConfigureAwait(false);
                    }

                    return new ApiResults <UploadFileResponse>(urlResults.HttpResponse, urlResults.Error);
                }
                else
                {
                    var largeFileRequest = new UploadLargeFileRequest(request.BucketId, request.FileName, content)
                    {
                        ContentType = request.ContentType,
                        FileInfo = request.FileInfo
                    };

                    return await UploadLargeFileAsync(largeFileRequest, progress, cancel).ConfigureAwait(false);
                }
            }));
        }