c# - Azure 云存储 SDK UploadFromStreamAsync 不起作用
问题描述
我正在尝试将文件上传到 .Net Core 2.1 中的 Azure blob 存储。下面是我的代码。
IFormFileCollection files = formCollection.Files;
foreach (var file in files)
{
if (file.Length > 0)
{
_azureCloudStorage.UploadContent(cloudBlobContainer, file.OpenReadStream(), file.FileName);
}
}
UploadContent
执行-
public async void UploadContent(CloudBlobContainer containerReference, Stream contentStream, string blobName)
{
try
{
using (contentStream)
{
var blockBlobRef = containerReference.GetBlockBlobReference(blobName);
//await containerReference.SetPermissionsAsync(new BlobContainerPermissions
//{
// PublicAccess = BlobContainerPublicAccessType.Blob
//});
await blockBlobRef.UploadFromStreamAsync(contentStream);
}
}
catch(Exception ex)
{
//Error here
}
}
代码执行时出现以下错误-
{System.ObjectDisposedException:无法访问已关闭的文件。在 System.IO.FileStream.get_Position() 在 Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.get_Position() 在 Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.VerifyPosition() 在 Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.ReadAsync(Byte [] 缓冲区,Int32 偏移量,Int32 计数,CancellationToken 取消令牌)在 Microsoft.WindowsAzure.Storage.Core.Util.StreamExtensions.WriteToAsync[T](流流,流 toStream,IBufferManager bufferManager,Nullable
1 copyLength, Nullable
1 maxLength,布尔 calculateMd5,ExecutionState1 executionState, StreamDescriptor streamCopyState, CancellationToken token) in C:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\Common\Core\Util\StreamExtensions.cs:line 301 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamAsyncHelper(Stream source, Nullable
1 长度, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, IProgress1 progressHandler, CancellationToken cancellationToken) in C:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\WindowsRuntime\Blob\CloudBlockBlob.cs:line 352 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamAsyncHelper(Stream source, Nullable
C:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\WindowsRuntime\Blob\CloudBlockBlob.cs:第 290 行的 Common.AzureCloudStorage.UploadContent( CloudBlobContainer containerReference,流 contentStream,字符串 blobName)
对我有用的替代解决方案: 使用流添加到 azure blob 存储
请问有什么帮助吗?如果我可以提供更多详细信息,请告诉我。
解决方案
我的解决方案是等到任务完成后再继续,例如
private async void SaveAsync(IFormFile file)
{
CloudBlockBlob blob = this.blobContainer.GetBlockBlobReference(file.FileName);
var task = blob.UploadFromStreamAsync(file.OpenReadStream(), file.Length);
while (task.IsCompleted == false) {
Thread.Sleep(1000);
}
}
也许传递长度也有帮助?
推荐阅读
- java - sun.* Java源码在哪里下载?
- java - 为什么我的代码有 IllegalStateException 错误
- sql - Excel VBA 为 Access 生成的 INSERT 语句在 VBA 中不起作用,但在 Access 中起作用
- database - 优雅地关闭 Elasticsearch 索引
- python - Python Actor 模型 + 异步(?)
- javascript - 无法一一访问以下结构?
- python-sphinx - 是否可以在 Sphinx 中保留长线?
- python - 在嵌套列表中查找匹配元素
- apache-kafka - Kafka Streaming 应用程序在与 Kafka 连接后仅读取最新消息
- tensorflow - 如何将映射函数应用于张量?(张量流.js)