我有这个代码应该上传用户发送的所有
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 行
好吧,我的一位同事通过更改 using 块内的代码为我解决了这个问题
using (FileStream stream = new FileStream(fullPath, FileMode.Create))
{
attach.CopyTo(stream);
stream.Flush();
}