【发布时间】:2018-12-16 10:13:47
【问题描述】:
我正在尝试将文件上传到 .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(字节[] 缓冲区,Int32 偏移量,Int32 计数,CancellationToken 取消令牌)在 Microsoft.WindowsAzure.Storage.Core.Util.StreamExtensions.WriteToAsync[T](流 stream, Stream toStream, IBufferManager bufferManager, Nullable
1 copyLength, Nullable1 maxLength, Boolean 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, Nullable1 长度,AccessCondition accessCondition, BlobRequestOptions 选项,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, Nullable1 长度,AccessCondition accessCondition, BlobRequestOptions 选项,OperationContext operationContext, C:\Program Files 中的 CancellationToken cancelToken) (x86)\Jenkins\workspace\release_dotnet_master\Lib\WindowsRuntime\Blob\CloudBlockBlob.cs:line 290 在 Common.AzureCloudStorage.UploadContent(CloudBlobContainer containerReference, Stream contentStream, String blobName)
对我有用的替代解决方案: adding to azure blob storage with stream
请问有什么帮助吗?如果我可以提供更多详细信息,请告诉我。
【问题讨论】:
-
等待从StreamAsync上传?
-
@OlaEkdahl 我尝试使用 awaiter-
blockBlobRef.UploadFromStreamAsync(contentStream).GetAwaiter(),但也没有用。也试过await,没用。 -
我在处理大文件时遇到了类似的问题,我不得不增加 maxRequestLength。也许这里的东西会起作用,stackoverflow.com/questions/38698350/…。
-
@OlaEkdahl 这个解决方案适合我-stackoverflow.com/questions/47296020/…
标签: c# azure asp.net-core azure-blob-storage