Azure存储:BlobClient在上载大型文件时不断重置自身
我正在尝试从连接到快速Wifi连接的手机上传一个200 MB的视频文件。我使用的是Azure Storage SDK for.NET的v12,但在大约30%的上载进度后,下面的代码会不断重置自身。重置发生时,进度从0开始,不会引发异常Azure存储:BlobClient在上载大型文件时不断重置自身,azure,xamarin,azure-storage,azure-storage-blobs,azure-blob-storage,Azure,Xamarin,Azure Storage,Azure Storage Blobs,Azure Blob Storage,我正在尝试从连接到快速Wifi连接的手机上传一个200 MB的视频文件。我使用的是Azure Storage SDK for.NET的v12,但在大约30%的上载进度后,下面的代码会不断重置自身。重置发生时,进度从0开始,不会引发异常 await blobClient.UploadAsync(stream, progressHandler: new Progress<long>(progress => { // show progress bar }), cancel
await blobClient.UploadAsync(stream, progressHandler: new Progress<long>(progress =>
{
// show progress bar
}), cancellationToken: cancellationToken);
因此,
blobClient
中似乎内置了并行化,但仍然失败。此外,我无法使用,因为它不适用于Xamarin表单
v12既有BlobClient又有BlockBlobClient。BlockBlobClient具有拆分为块并上载每个块的功能
您可以尝试Microsoft.Azure.Storage.DataMovement
“Microsoft Azure存储数据移动库提供了一组API
扩展现有Azure Storage.Net客户端库以提供帮助
客户传输高性能Azure Blob和文件存储,
可扩展性和可靠性。”
如果您想将文件以区块形式上载到Azure blob存储,请参考以下代码
public async Task upload(Stream stream){
string connectionString = "";
string containerName = "upload";
string blobName = "";
BlockBlobClient blobClient = new BlockBlobClient(connectionString, containerName, blobName);
List<string> blockList = new List<string>();
while (true) {
byte[] b = new byte[1024 * 1024];
var n = await stream.ReadAsync(b, 0, 1024 * 1024);
if (n == 0) break;
string blockId = Guid.NewGuid().ToString();
string base64BlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId));
await blobClient.StageBlockAsync(base64BlockId, new MemoryStream(b, true));
blockList.Add(base64BlockId);
}
await blobClient.CommitBlockListAsync(blockList);
}
var uri = new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}/{blobName}?{sasToken}");
BlockBlobClient blobClient = new BlockBlobClient(uri);
谢谢我不知道这个包裹存在。我使用的是Xamarin表单,无法使用此包,因为我一直收到“Mono.Posix.NETStandard”参考问题。我安装了Posix Nuget,但我仍然在Android项目中遇到问题。这就是我一直在寻找的。谢谢我不向客户端发送连接字符串。相反,我使用SAS令牌。你能更新你的代码来反映这一点,这样我就可以接受它作为一个答案吗?此外,如何将其并行化?似乎此代码正在序列化块上载。@user246392您能告诉我您的意思是什么
如何并行化?是否可以创建多个任务
对象并并行放置块以加快上载过程?@user246392是的,您可以这样做。但是,当您提交阻止列表时,您需要将所有blockid按顺序排列
var uri = new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}/{blobName}?{sasToken}");
BlockBlobClient blobClient = new BlockBlobClient(uri);