Azure存储:BlobClient在上载大型文件时不断重置自身

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

我正在尝试从连接到快速Wifi连接的手机上传一个200 MB的视频文件。我使用的是Azure Storage SDK for.NET的v12,但在大约30%的上载进度后,下面的代码会不断重置自身。重置发生时,进度从0开始,不会引发异常

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);