/// <summary> /// Upload one part of an already started large file upload. /// </summary> /// <param name="fileData"></param> /// <param name="fileName"></param> /// <param name="bucketId"></param> /// <param name="cancelToken"></param> /// <returns></returns> public async Task <B2UploadPart> UploadPart(byte[] fileData, int partNumber, B2UploadPartUrl uploadPartUrl, CancellationToken cancelToken = default(CancellationToken)) { var request = LargeFileRequestGenerators.Upload(_options, fileData, partNumber, uploadPartUrl); var response = _client.SendAsync(request, cancelToken).Result; return(await ResponseParser.ParseResponse <B2UploadPart>(response, _api)); }
private async Task <B2File> UploadLargeFile(UploadObject uploadObject, string b2Path, string contentType) { B2File file; ConcurrentDictionary <int, string> Sha1List = new ConcurrentDictionary <int, string>(); List <UploadParts> uploadParts = GetUploadPartList(new FileStream(uploadObject.FileObject.FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); B2File largeFile = await Client.LargeFiles.StartLargeFile(b2Path, contentType); await uploadParts.ForEachAsync(4, async uploadPart => { try { // Log.Information("Uploading | TID {0}, Count {1}", // Thread.CurrentThread.ManagedThreadId, uploadPart.PartNumber); byte[] currentBytes = new byte[uploadPart.CurrentBytes]; FileStream currentStream = new FileStream(uploadObject.FileObject.FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); currentStream.Seek(uploadPart.LastBytes, SeekOrigin.Begin); currentStream.Read(currentBytes, 0, currentBytes.Length); B2UploadPartUrl uploadPartUrl = await Client.LargeFiles.GetUploadPartUrl(largeFile.FileId); await Client.LargeFiles.UploadPart(currentBytes, uploadPart.PartNumber, uploadPartUrl); Sha1List.TryAdd(uploadPart.PartNumber, Utils.BytesToSha1Hash(currentBytes)); } catch (Exception e) { Log.Error(e.ToString()); } }); string[] sortedSha1List = new string[Sha1List.Count]; for (int i = 0; i < Sha1List.Count; i++) { sortedSha1List[i] = Sha1List[i + 1]; } file = await Client.LargeFiles.FinishLargeFile(largeFile.FileId, sortedSha1List); return(file); }
/// <summary> /// Upload a file to B2. This method will calculate the SHA1 checksum before sending any data. /// </summary> /// <param name="options"></param> /// <param name="uploadUrl"></param> /// <param name="fileData"></param> /// <param name="fileName"></param> /// <param name="fileInfo"></param> /// <returns></returns> public static HttpRequestMessage Upload(B2Options options, byte[] fileData, int partNumber, B2UploadPartUrl uploadPartUrl) { if (partNumber < 1 || partNumber > 10000) { throw new Exception("Part number must be between 1 and 10,000"); } var uri = new Uri(uploadPartUrl.UploadUrl); var request = new HttpRequestMessage() { Method = HttpMethod.Post, RequestUri = uri, Content = new ByteArrayContent(fileData) }; // Get the file checksum string hash = Utilities.GetSHA1Hash(fileData); // Add headers request.Headers.Add("Authorization", uploadPartUrl.AuthorizationToken); request.Headers.Add("X-Bz-Part-Number", partNumber.ToString()); request.Headers.Add("X-Bz-Content-Sha1", hash); request.Content.Headers.ContentLength = fileData.Length; return(request); }