【问题标题】:C# Azure AppendBlob AppendBlock adding a file larger than the 4mb limitC# Azure AppendBlob AppendBlock 添加大于 4mb 限制的文件
【发布时间】:2020-06-03 20:47:05
【问题描述】:

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

我在 C# .NET Core 中使用 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 的文件块,但我没有找到最佳方法的示例。

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

【问题讨论】:

  • 说“它不起作用”并不是一个有用的开始。请添加错误消息等。另外,您查看过 API 文档吗? docs.microsoft.com/en-us/dotnet/api/…
  • 抱歉,我已经编辑了我的问题以包含更多细节。
  • 只需将AppendBlock() 与这样的东西结合起来? stackoverflow.com/a/6865956/1537195
  • 只是为了仔细检查:您为什么使用 Append Blob 与 Block Blob?
  • @silent 第一次上传会有大量数据,之后只会追加增量。所以 Append Blob 对此很有意义。我只是测试了一个块blob,并且能够上传一个6gb的文件,并且从我正在读取块blob上传方法为你处理分块,并且出现AppendBlob AppendBlock方法对于附加来说不是这样我必须制作我自己的块

标签: c# azure .net-core azure-blob-storage


【解决方案1】:

我要感谢 @silent 的回复,因为他提供了足够的信息来解决我的需要。有时只是让某人谈论事情可以帮助我解决问题。

我在 BlockBlobClient.Upload 方法中发现它会为您分块文件流。我相信这是我研究的 100mb 块。它似乎有 100mb 个块的限制,其中有 50,000 个

对于 AppendBlockClient.AppendBlock,它不会为您分块您的流。它有 4mb 个块和 50,000 个块的限制。

这是我的代码的一部分,它允许我上传一个 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();
}

【讨论】:

  • 很高兴它成功了。顺便说一句,我强烈建议始终使用 API 的异步版本,例如 AppendBlockAsync()
  • @silent 你能告诉我原因吗?我开始这样做,因为这是一个 .NET Core 控制台应用程序,我遇到了各种问题和大量额外的工作,以便能够调用需要等待的异步方法,然后是从方法返回值的任务。
  • 简而言之:基本上总是使用异步! stackoverflow.com/a/48023725/1537195 顺便说一句,在控制台应用程序中,您可以从 public static async Task&lt;int&gt; Main(string[] args) 开始,让您的生活更轻松。从那里开始编程并没有太大区别
  • 谢谢,现在把一切都整理好,在这些方法可用的地方全部改成异步。
  • getting Status: 409 (blob type is invalid for this operation.) on line appendBlobClient.AppendBlock(stream);
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多