【问题标题】:Large Fileupload to Azure with Blob Storage with BlobContainerClient使用 BlobContainerClient 将大型文件上传到 Azure
【发布时间】:2020-12-28 07:04:34
【问题描述】:

我想将大文件上传到 Azure Blob 存储 (500-2000MB),我尝试使用以下代码执行此操作:

private BlobContainerClient containerClient;    
public async Task<UploadResultDto> Upload(FileInfo fileInfo, string remotePath)
        {
            try
            {
                var blobClient = containerClient.GetBlobClient(remotePath + "/" + fileInfo.Name);

                var transferOptions = new StorageTransferOptions
                {
                    MaximumConcurrency = 1,
                    MaximumTransferSize = 10485760,
                    InitialTransferSize = 10485760
                };

                await using var uploadFileStream = File.OpenRead(fileInfo.FullName);
                
                await blobClient.UploadAsync(uploadFileStream, transferOptions: transferOptions);
                uploadFileStream.Close();

                return new UploadResultDto()
                {
                    UploadSuccessfull = true
                };

            }
            catch (Exception ex)
            {
                Log.Error(ex,$"Error while uploading File {fileInfo.FullName}");
            }

            return new UploadResultDto()
            {
                UploadSuccessfull = false
            };
        }

我立即收到以下消息:

The specified blob or block content is invalid.
RequestId:c5c2d925-701e-0035-7ce0-8691a6000000
Time:2020-09-09T19:33:40.9559646Z
Status: 400 (The specified blob or block content is invalid.)

如果我从StorageTransferOptions 中删除InitialTransferSize,一段时间后我会收到以下错误:

retry failed after 6 tries. (The operation was canceled.)

据我了解,新 SDK 的分块上传以及 blockIds 等的整个处理都应该由 SDK 完成。还是我错了?

有人知道为什么这不起作用吗?对于 BlobContainerClient,我没有发现任何与此不同的地方,仅适用于旧的 cloudblobcontainer。

更新: 一些附加信息:

这是一个 .netCore 3.1 应用程序,与库 Topshelf 作为 Windows 服务一起运行

【问题讨论】:

  • 这是什么? await using var uploadFileStream = File.OpenRead(fileInfo.FullName); 这是我不知道的 C# 中的一些新东西吗?
  • 哇好甜。感谢您的信息。
  • 我遇到了“重试 6 次后重试失败。任务已取消。”尝试将 3GB Azure SQL 数据库导出到 Azure 存储。工作了很多年,直到这个月都没有问题。

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


【解决方案1】:

StorageTransferOptions 中删除InitialTransferSize 后问题的第二部分与问题in this question 类似。

您可以通过如下设置 blob 客户端的超时来解决此问题:

var blobClientOptions = new BlobClientOptions
{
    Transport = new HttpClientTransport(new HttpClient { Timeout = Timeout.InfiniteTimeSpan }),
    Retry = { NetworkTimeout = Timeout.InfiniteTimeSpan }
};

InfiniteTimeSpan 可能有点矫枉过正,但至少它会证明这是否是问题所在。

这些设置为我摆脱了“尝试 6 次后重试失败”错误,并在我开始使用 Azure.Storage.Blobs v12.8.0 包时获得了上传

【讨论】:

    【解决方案2】:

    我创建了一个新的控制台应用程序并使用您的代码进行测试,效果非常好。

    1.确认您没有inconsistencies in assemblies。删除早期版本的Azure.Storage.Blobs 并更新它to the latest version

    为什么你的containerClient私人的?您可以使用以下代码在Upload 方法中设置它:

    BlobServiceClient blobServiceClient = new BlobServiceClient(connectionstring);
    BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("containerName");
    var blobClient = containerClient.GetBlobClient(remotePath + "/" +fileInfo.Name);
    

    【讨论】:

    • 我安装了最新版本 (12.6.0) 的 Azure.Storage.Blobs,我还清理并重新安装了所有内容。还是一样的错误containerClient是在构造函数中初始化的,这样我就不需要在每个需要的方法中都初始化了。
    【解决方案3】:

    我无法让它与版本 12.6.0 一起使用...

    我降级到 Microsoft.Azure.Storage.Blob v11 并基于这个线程实现了上传 https://stackoverflow.com/a/58741171/765766

    这对我来说很好用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多