【发布时间】:2020-08-12 08:33:00
【问题描述】:
我正在分块接收文件内容。正如我所读到的,推荐使用 Azure blob 存储的最新 nuget 是 Azure.Storage.Blobs,但我找不到任何示例或方法如何分块上传文件?支持吗?
我收到的范围是Range 标头。我正在使用这个quickstart
【问题讨论】:
-
您是否尝试过使用 AppendBlob?
标签: c# azure asp.net-core
我正在分块接收文件内容。正如我所读到的,推荐使用 Azure blob 存储的最新 nuget 是 Azure.Storage.Blobs,但我找不到任何示例或方法如何分块上传文件?支持吗?
我收到的范围是Range 标头。我正在使用这个quickstart
【问题讨论】:
标签: c# azure asp.net-core
您想要使用的方法是 BlockBlobClient.StageBlock 上传块数据和 BlockBlobClient.CommitBlock 提交块并创建块 blob。
这是一个非常糟糕的功能实现:)。它基本上是从本地计算机读取一个非常大的文件,然后通过将文件分成 1MB 块来上传。
static void UploadBlobsInChunks()
{
var containerClient = new BlobContainerClient(connectionString, "test");
containerClient.CreateIfNotExists();
var filePath = @"C:\temp\mymovie.mp4";
var blockBlobClient = containerClient.GetBlockBlobClient("mymovie.mp4");
int blockSize = 1 * 1024 * 1024;//1 MB Block
int offset = 0;
int counter = 0;
List<string> blockIds = new List<string>();
using (var fs = File.OpenRead(filePath))
{
var bytesRemaining = fs.Length;
do
{
var dataToRead = Math.Min(bytesRemaining, blockSize);
byte[] data = new byte[dataToRead];
var dataRead = fs.Read(data, offset, (int) dataToRead);
bytesRemaining -= dataRead;
if (dataRead > 0)
{
var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(counter.ToString("d6")));
blockBlobClient.StageBlock(blockId, new MemoryStream(data));
Console.WriteLine(string.Format("Block {0} uploaded successfully.", counter.ToString("d6")));
blockIds.Add(blockId);
counter++;
}
}
while (bytesRemaining > 0);
Console.WriteLine("All blocks uploaded. Now committing block list.");
var headers = new BlobHttpHeaders()
{
ContentType = "video/mp4"
};
blockBlobClient.CommitBlockList(blockIds, headers);
Console.WriteLine("Blob uploaded successfully!");
}
}
【讨论】:
var blockBlobClient = containerClient.GetBlockBlobClient("mymovie.mp4") 替换为您的路径即可。例如。 var blockBlobClient = containerClient.GetBlockBlobClient("folder1/folder2/file.jpg")