使用文件上传控件读取文件时遇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
相关产品推荐
相关产品推荐

