C#Azure AppendBlob AppendBlock添加大于4mb限制的文件

C#Azure AppendBlob AppendBlock添加大于4mb限制的文件,c#,azure,.net-core,azure-storage-blobs,C#,Azure,.net Core,Azure Storage Blobs,我搜索了又搜索,没有找到任何例子 我正在使用C#.NET内核中的Azure.Storage.Blobs nuget包 下面是一个我目前的代码不起作用的例子 我得到一个状态:413(请求主体太大,超出了允许的最大限制。) 搜索似乎表明存在4mb限制或100mb限制,这还不清楚,但我认为追加blob上有4mb限制,块blob上有100mb限制 var appendBlobClient = containerClient.GetAppendBlobClient(string.Format("{0}/{

我搜索了又搜索,没有找到任何例子

我正在使用C#.NET内核中的Azure.Storage.Blobs nuget包

下面是一个我目前的代码不起作用的例子

我得到一个状态:413(请求主体太大,超出了允许的最大限制。)

搜索似乎表明存在4mb限制或100mb限制,这还不清楚,但我认为追加blob上有4mb限制,块blob上有100mb限制

var appendBlobClient = containerClient.GetAppendBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

using FileStream uploadFileStream = File.OpenRead(filePath);
appendBlobClient.CreateIfNotExists();
appendBlobClient.AppendBlock(uploadFileStream);
uploadFileStream.Close();
这不起作用,因为4mb的限制,所以我需要附加4mb的文件块,但我还没有找到最好的方法


所以我想弄清楚的是上传大文件的最佳方式似乎必须分块完成可能4mb用于追加blob,100mb用于块blob,但文档不清楚,也没有示例。

我要感谢@silent的回复,因为他提供了足够的信息来解决我需要的问题。有时候,有人把事情说清楚能帮我把事情弄清楚

我在BlockBlobClient.Upload方法中找到的内容可以为您分块文件流。我相信这距离我的研究有100mb的距离。它似乎有100mb的块和50000个块的限制

对于AppendBlockClient.AppendBlock,它不会为您分块流。它限制了4mb的区块和50000个区块

这是我的代码的一部分,它允许我上传一个6gb的文件作为块blob,上传一个200mb的文件作为附加blob

BlobServiceClient blobServiceClient = new BlobServiceClient(azureStorageAccountConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(azureStorageAccountContainerName);
containerClient.CreateIfNotExists();

if (appendData)
{
    var appendBlobClient = containerClient.GetAppendBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

    appendBlobClient.CreateIfNotExists();

    var appendBlobMaxAppendBlockBytes = appendBlobClient.AppendBlobMaxAppendBlockBytes;
    using (var file = File.OpenRead(filePath))
    {
        int bytesRead;
        var buffer = new byte[appendBlobMaxAppendBlockBytes];
        while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
        {
            //Stream stream = new MemoryStream(buffer);
            var newArray = new Span<byte>(buffer, 0, bytesRead).ToArray();
            Stream stream = new MemoryStream(newArray);
            stream.Position = 0;
            appendBlobClient.AppendBlock(stream);
        }
    }
}
else
{
    var blockBlobClient = containerClient.GetBlockBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

    using FileStream uploadFileStream = File.OpenRead(filePath);
    blockBlobClient.DeleteIfExists();
    blockBlobClient.Upload(uploadFileStream);
    uploadFileStream.Close();
}
BlobServiceClient BlobServiceClient=新的BlobServiceClient(azureStorageAccountConnectionString);
BlobContainerClient containerClient=blobServiceClient.GetBlobContainerClient(azureStorageAccountContainerName);
containerClient.CreateIfNotExists();
如果(追加数据)
{
var appendBlobClient=containerClient.GetAppendBlobClient(string.Format(“{0}/{1}”,tenantName,Path.GetFileName(filePath));
appendBlobClient.CreateIfNotExists();
var appendBlobMaxAppendBlockBytes=appendBlobClient.appendBlobMaxAppendBlockBytes;
使用(var file=file.OpenRead(filePath))
{
int字节读取;
var buffer=新字节[appendBlobMaxAppendBlockBytes];
而((bytesRead=file.Read(buffer,0,buffer.Length))>0)
{
//流=新内存流(缓冲区);
var newArray=newspan(缓冲区,0,字节读取).ToArray();
流=新内存流(newArray);
流位置=0;
appendBlobClient.AppendBlock(流);
}
}
}
其他的
{
var blockBlobClient=containerClient.GetBlockBlobClient(string.Format(“{0}/{1}”,tenantName,Path.GetFileName(filePath));
使用FileStream uploadFileStream=File.OpenRead(filePath);
blockBlobClient.DeleteIfExists();
blockBlobClient.Upload(上传文件流);
uploadFileStream.Close();
}

说“它不工作”不是一个有用的开始。请添加错误消息等。此外,您是否查看了API文档?很抱歉,我已经编辑了我的问题以包含更多细节。是否将
AppendBlock()
与类似的内容结合起来?请仔细检查:为什么要使用Append Blobs vs Block Blobs?@silent第一次上传将是大量数据,之后只会向其添加增量。因此,Append Blob对此很有意义。我刚刚测试了一个blockblob,能够上传一个6gb的文件,从我阅读的blockblob上传方法为您处理了分块,并且AppendBlob AppendBlock方法似乎不适用于appends,所以对于appends,我必须制作自己的分块。顺便说一句,我强烈建议始终使用API的异步版本,例如
AppendBlockAsync()
@silent您能告诉我原因吗?我开始这样做,因为这是一个.NET核心控制台应用程序,我遇到了各种各样的问题和很多额外的工作,以便能够调用异步方法,这些方法需要等待,然后任务从方法返回值。简言之:基本上总是使用异步!顺便说一句,在一个控制台应用程序中,你可以从一个
公共静态异步任务Main(string[]args)
开始,让你的生活变得更加轻松。从那以后,它与ProgramThank没有太大的区别。谢谢,现在把它整理好了,并在那些方法可用的地方将它全部改为async。