使用 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.
为什么你的 containerClient
是 private?您可以使用以下代码在 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 包时获得了上传
我想将大文件上传到 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.
为什么你的 containerClient
是 private?您可以使用以下代码在 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 包时获得了上传