You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将IFormFile转换为byte[]时出现‘无法访问已释放对象’错误

问题原因

你遇到的Cannot access a disposed object. Object name: 'FileBufferingReadStream'错误,本质是IFormFile的生命周期与HTTP请求上下文绑定。当文件上传的请求处理完成后,ASP.NET Core会自动释放IFormFile关联的FileBufferingReadStream流。你直接缓存了IFormFile对象,等到后续GET请求读取时,原请求上下文已销毁,流早已被释放,因此无法访问。

解决方案

核心思路:不要缓存IFormFile对象本身,在接收文件的阶段就将文件内容转换成可持久存储的格式(byte[]或本地文件路径),再缓存转换后的数据。

1. 调整数据结构

修改DocumentDto,移除IFormFile类型的File属性,替换为byte[]类型的FileContent(或存储文件路径的FilePath字符串):

public class DocumentDto
{
    public byte[] FileContent { get; set; }
    // 其他原有属性...
}

2. 在上传阶段完成转换

在处理文件上传的POST接口中,先把IFormFile转换成byte[],再存入缓存:

// 示例:文件上传接口
public async Task<IActionResult> Upload(IFormFile file)
{
    byte[] fileBytes;
    using (var memoryStream = new MemoryStream())
    {
        await file.CopyToAsync(memoryStream);
        fileBytes = memoryStream.ToArray();
    }

    // 构建Dto并存入缓存
    var docDto = new DocumentDto { FileContent = fileBytes };
    var userDocs = memoryCache.TryGetValue(DEFAULT_USER, out List<DocumentDto>? existingDocs) 
        ? existingDocs 
        : new List<DocumentDto>();
    userDocs.Add(docDto);
    memoryCache.Set(DEFAULT_USER, userDocs);

    return Ok("文件上传并缓存成功");
}

3. 修改Analyse端点逻辑

直接读取缓存中的byte[],无需再操作已释放的流:

public async Task<ActionResult<List<AnalyseResponse>>> Analyse()
{
    logger.LogInformation($"GET /analyse called");

    var cachedFiles = this.documentService.GetUserDocuments(DEFAULT_USER);
    try
    {
        if (!cachedFiles.Any())
        {
            logger.LogError($"No documents cached for current user={DEFAULT_USER}");
            return StatusCode(400, $"No documents cached for current user={DEFAULT_USER}");
        }

        // 直接使用缓存中的byte[]
        byte[] fileBytes = cachedFiles[0].FileContent;
        // 后续业务逻辑处理...

(......)

大文件场景优化

如果处理的是大文件,缓存byte[]会占用过多内存,建议改为:

  • 上传时将文件保存到服务器本地目录,记录文件路径
  • 缓存文件路径而非byte[]
  • Analyse端点读取时,直接从本地文件路径读取内容

内容的提问来源于stack exchange,提问作者AMFerreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:40:06