System.ObjectDisposeException:'无法访问已处置的对象。对象名称:'System.String'。'

问题描述 投票:0回答:1

我有这个代码应该上传用户发送的所有

Attachment

private async Task<List<AttchmentsMetaData>> UploadAttachments(IEnumerable<IFormFile> Attachments, string TaskTitle)
{
    // 1. Configure storage location and path generation
     string uploadPath = Path.Combine(_hostingEnvironment.ContentRootPath, "attachments",$"{TaskTitle}" ); 
    
    List<AttchmentsMetaData> metaData = [];
    // 2. Process and store each uploaded file
    Directory.CreateDirectory(uploadPath);
    foreach (IFormFile attach in Attachments)
    {
        string uniqueFileName = attach.FileName;
        string fullPath = Path.Combine(uploadPath, uniqueFileName);

        using (FileStream stream =  new FileStream(fullPath, FileMode.Create))
        {
            await attach.CopyToAsync(stream);
        }
        metaData.Add( new AttchmentsMetaData {id = Guid.NewGuid().ToString(), OriginalFileName = attach.FileName, ContentType = attach.ContentType, FileSize = attach.Length });
    }
    return (metaData);
}

如果

Attachment
只有一项,它可以工作,但如果有多于一项,它会在第二次迭代中失败,并给出上述错误:

System.ObjectDisposeException:“无法访问已处置的对象。对象名称:'System.String'。'

我尝试为文件流添加手动处理。
我尝试多次调用该函数并仅传递一项。

编辑:

这是更多信息 线程 0x3838 已退出,代码为 0 (0x0)。 抛出异常:System.Private.CoreLib.dll 中的“System.ObjectDisposeException” 抛出异常:System.Private.CoreLib.dll 中的“System.ObjectDisposeException” System.Private.CoreLib.dll 中发生“System.ObjectDisposeException”类型的异常,但未在用户代码中处理 无法访问已处置的对象。

对象名称:“System.String”。 在 Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.set_Position(Int64 值) 在 Microsoft.AspNetCore.Http.FormFile.OpenReadStream() 在 Microsoft.AspNetCore.Http.FormFile.CopyToAsync(流目标,CancellationToken CancellationToken) 在 D:\ASP.NET icketing-system-Dev-Nxt-level\Services\TaskService.cs 中的 Ticketing_system_Dev_Nxt_level.Services.TaskService.UploadAttachments(IEnumerable`1 Attachments, String TaskTitle):第 334 行

c# asp.net-mvc objectdisposedexception
1个回答
0
投票

好吧,我的一位同事通过更改 using 块内的代码为我解决了这个问题

using (FileStream stream =  new FileStream(fullPath, FileMode.Create))
    {
        attach.CopyTo(stream);
        stream.Flush();
    }
© www.soinside.com 2019 - 2024. All rights reserved.