azure - 仅上传最后一个文件 (Azure Blob)
问题描述
我将文件集合以并行方式上传到 blob(C# 中的 IFormFiles)。
我使用信号量和 TPL 来并行上传。(来源)
但除最后一个文件外,所有文件都仅以 64 Kb 上传。最新文件已完全上传。
我不知道为什么忽略 4Mb 的块大小并使用 64Kb 以及为什么只上传 1 个块默认大小。
这是一个代码:
public static async Task UploadBulkAsync(string storageConnectionString, string containerName, Dictionary<string, IFormFile> blobNameToFile)
{
var completed = 0;
var semaphore = new SemaphoreSlim(AppGlobalSettings.BulkUploadAzureBlobThreadCount, AppGlobalSettings.BulkUploadAzureBlobThreadCount);
var tasks = new List<Task>();
var options = new BlobRequestOptions
{
ParallelOperationThreadCount = 20
};
var blobContainer = await GetContainerAsync(storageConnectionString, containerName);
await blobContainer.SetPermissionsAsync(new BlobContainerPermissions() { PublicAccess = BlobContainerPublicAccessType.Blob });
foreach (var one in blobNameToFile)
{
var name = one.Key;
var file = one.Value;
var blockBlob = blobContainer.GetBlockBlobReference(name);
blockBlob.Properties.ContentType = file.ContentType;
await semaphore.WaitAsync();
tasks.Add(blockBlob.UploadFromStreamAsync(file.OpenReadStream(), null, options, null).ContinueWith(t =>
{
semaphore.Release();
Interlocked.Increment(ref completed);
}));
}
await Task.WhenAll(tasks);
}
解决方案
问题出在 IFormFile 对象的集合中。您不能在同一请求处理中打开多个 IFormFile 流。它们需要按顺序处理。
推荐阅读
- php - 使用 Laravel 和 Eloquent ORM 的查询案例
- asp.net-core - 如何将默认语言传递到注册页面?
- java - Arquillian RESTful Web 服务测试 - URL 错误
- asp.net - Listview 更新数据库
- google-app-engine - Google App Engine:部署期间构建超时
- d3.js - 无法使用 d3 层次结构构造 d3 树结构不平衡树
- macos - 适用于 Mac 的 Xamarin Android 播放器无法正常工作
- php - php - 区分大小写的函数,用于计算字符串中有多少个字符
- excel - 如何复制范围,忽略第 2 列中的值为空白的行
- javascript - 在 express 中设置静态 javascript 文件的内容类型