问题描述
所以我试图逐块上传文件... 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);
}