使用 BlobContainerClient 使用 Blob 存储将大文件上传到 Azure

Large Fileupload to Azure with Blob Storage with BlobContainerClient

我想将大文件上传到 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,分块上传以及 blockId 等的整个处理应该由 SDK 完成。还是我错了?

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

更新: 一些附加信息:

它是一个 .netCore 3.1 应用程序,作为 Windows 服务

与库 Topshelf 一起运行

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

1.Confirm 你没有 inconsistencies in assemblies. Remove the earlier version of Azure.Storage.Blobs and update you itto the latest version.

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

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

我无法使用 12.6.0 版...

我降级到Microsoft.Azure.Storage.Blobv11,并根据这个线程实现了上传

现在这对我来说很好

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 包时获得了上传