我可以使用putblock作为append blob吗?

问题描述

所以我试图逐块上传文件... Can PutBlock be used to append to an existing BlockBlob in Azure来自此示例... 我正在上传一个20mb的文件,但是最后,当我在容器上看到该文件时,它是7mb,而当我下载blob时,它坏了……我在做什么错了?

 public async Task AppendBlobOnAsset(Stream stream,MediaServiceRequest request)
        {
            var cloudBlobContainer = new CloudBlobContainer(request.InputAssetStorageUri);
            var blockBlob = cloudBlobContainer.GetBlockBlobReference(request.BlobName);

            var blockList = new List<ListBlockItem>();
            var blockListItems = new List<string>();
            if (true)
            {
                var blocks = await blockBlob.DownloadBlockListAsync();
                blockList = blocks.ToList();
                blockListItems = blockList.Select(x => x.Name).ToList();
            }
            //string blockId = Guid.NewGuid().ToString("m");
            string blockId = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("0000005"));
            blockBlob.PutBlock(blockId,stream,null);

            blockListItems.Add(blockId);
            blockBlob.PutBlockList(blockListItems);
        }


  using var file = File.OpenRead("C:\\Projects\\file.mp4");
            int bytesRead;
            var appendBlobMaxAppendBlockBytes = 4000000;
            var buffer = new byte[appendBlobMaxAppendBlockBytes];
            while ((bytesRead = await file.ReadAsync(buffer,buffer.Length)) > 0)
            {
                var newArray = new Span<byte>(buffer,bytesRead).ToArray();
                Stream stream = new MemoryStream(newArray);
                stream.Position = 0;
                await AppendBlobOnAsset(stream,request);
            }

解决方法

 public async Task AppendBlobOnAssetAsync(int blockId,Stream stream,MediaServiceRequest request)
        {
            var cloudBlobContainer = new CloudBlobContainer(request.InputAssetStorageUri);
            var blockBlob = cloudBlobContainer.GetBlockBlobReference(request.BlobName);

            var blockItems = new List<ListBlockItem>();
            var blockItemIds = new List<string>();

            if (blockId > 0)
            {
                var blocks = await blockBlob.DownloadBlockListAsync();
                blockItems = blocks.ToList();
                blockItemIds = blockItems.Select(x => x.Name).ToList();
            }

            var Id = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId.ToString(CultureInfo.InvariantCulture).PadLeft(30,'0')));

            blockBlob.PutBlock(Id,stream,null);

            blockItemIds.Add(Id);
            blockBlob.PutBlockList(blockItemIds);
        }