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

使用文件上传控件读取文件时遇FileNotFoundException问题求助

问题分析与解决方案

兄弟,你碰到的System.IO.FileNotFoundException问题根源很清楚:你在后端用file.FileName去创建FileStream,但这个FileName只是客户端本地的原始文件名,并不是服务器上的有效文件路径。系统会默认在当前项目的运行目录下找这个文件,自然找不到,所以抛出了异常。

你的原始代码(方便对照)

前端代码:

<input type="file" name="file" /> <button type="submit">Upload File</button>

后端代码:

[HttpPost] 
public IActionResult UploadFile(IFormFile file) 
{ 
    string FileName = file.FileName; 
    if (file != null && file.Length != 0) 
    { 
        FileStream fileStream = new FileStream(FileName, FileMode.Open); 
        using (StreamReader streamReader = new StreamReader(fileStream)) 
        { 
            string line = streamReader.ReadLine(); 
        } 
    } 
}

解决方案1:直接读取上传文件内容(无需先保存到服务器)

IFormFile已经自带了直接读取文件流的方法OpenReadStream(),你根本不需要自己去打开本地文件,直接用这个方法就行:

[HttpPost] 
public IActionResult UploadFile(IFormFile file) 
{ 
    if (file != null && file.Length != 0) 
    { 
        // 直接使用IFormFile提供的流读取内容
        using (var streamReader = new StreamReader(file.OpenReadStream())) 
        { 
            string line = streamReader.ReadLine(); 
            // 这里可以处理读取到的内容
        } 
    }
    return Ok();
}

解决方案2:先将文件保存到服务器,再读取

如果你确实需要把文件先存到服务器的某个目录再读取,那必须指定服务器上的完整路径,比如结合ASP.NET Core的wwwroot静态文件目录,同时建议处理文件名重复的情况:

[HttpPost] 
public IActionResult UploadFile(IFormFile file) 
{ 
    if (file != null && file.Length != 0) 
    { 
        // 1. 定义服务器上的保存目录,比如wwwroot下的uploads文件夹
        var uploadsDir = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "uploads");
        // 确保目录存在,不存在就创建
        if (!Directory.Exists(uploadsDir))
        {
            Directory.CreateDirectory(uploadsDir);
        }

        // 2. 生成唯一文件名(避免重名覆盖)
        var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);
        var filePath = Path.Combine(uploadsDir, uniqueFileName);

        // 3. 保存文件到服务器
        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            file.CopyTo(fileStream);
        }

        // 4. 现在可以读取刚保存的文件了
        using (var streamReader = new StreamReader(filePath))
        {
            string line = streamReader.ReadLine();
            // 处理内容
        }
    }
    return Ok();
}

关键提醒

  • 永远不要直接信任客户端传来的FileName,除了路径问题,还可能存在安全风险(比如包含恶意路径)。
  • 如果处理大文件,建议用流式处理或者分块上传,避免内存占用过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:56