/// <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);
/// <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); } })); }