Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        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);
        }