コード例 #1
0
        private async Task CopyStreamToBlobAsync(Stream sourceStream, BlobContainerClient container, string blobName, int bufferSize, string sourceMD5, CancellationToken cancellationToken)
        {
            var blob = container.GetBlockBlobClient(blobName);

            var blobHasher = CopyUtils.GetMD5Hasher();

            var blockIDs    = new List <string>();
            var blockNumber = 0;

            await CopyUtils.CopyAsync(
                (buffer, ct) => CopyUtils.ReadStreamMaxBufferAsync(buffer, sourceStream, ct),
                async (buffer, count, cancellationToken2) =>
            {
                var blockId = GetBlockId(blockNumber);
                blockIDs.Add(blockId);

                var blockMD5Hash = CopyUtils.GetMD5Hash(buffer, 0, count);
                CopyUtils.AppendMDHasherData(blobHasher, buffer, 0, count);

                using (var ms = new MemoryStream(buffer, 0, count))
                {
                    await blob.StageBlockAsync(blockId, ms, blockMD5Hash, null, null, cancellationToken);
                }

                blockNumber++;
            },
                bufferSize,
                cancellationToken
                );

            var blobHash = CopyUtils.GetMD5Hash(blobHasher);

            if ((!string.IsNullOrEmpty(sourceMD5)) && (sourceMD5 != CopyUtils.GetMD5HashString(blobHash)))
            {
                throw new Exception("Invalid destination MD5");
            }

            var headers = new global::Azure.Storage.Blobs.Models.BlobHttpHeaders()
            {
                ContentHash = blobHash
            };

            await blob.CommitBlockListAsync(blockIDs, headers, null, null, null, cancellationToken);
        }