ASP.NET Core 5.0 MVC 下载文件时报DirectoryNotFoundException异常如何解决?
异常触发原因
- 路径拼接规则错误:
Path.Combine方法如果遇到第二个参数带前导根路径符号(比如Windows下的\、/,或者盘符开头),会直接丢弃前面拼接的_webHostEnvironment.WebRootPath,导致最终生成的路径和你实际存放文件的路径不一致。你报错的路径直接指向D盘根目录的images文件夹,大概率是WC.ImagePath[1]配置了带前导斜杠的路径。 - 文件名后缀缺失:代码中直接取
objdata.PofId作为文件名,若数据库中存储的PofId只有GUID值没有.jpg后缀,拼接出来的路径会和实际带后缀的文件路径不匹配。 - 运行权限不足:应用程序运行所使用的账户(IIS部署时对应
IIS_IUSRS用户组,本地调试时对应Windows当前登录账户)没有目标文件夹的读取权限,系统会误判路径不存在抛出该异常。 - 路径配置错位:
_webHostEnvironment.WebRootPath默认指向项目的wwwroot文件夹,如果你把图片存放在了wwwroot以外的路径,拼接出来的路径自然找不到对应文件。
解决方案
- 校验修正路径拼接逻辑
在控制器代码中FilePath赋值后打断点或输出日志,确认生成的完整路径和你实际存放文件的路径完全一致:- 若
WC.ImagePath[1]带前导/或\,删掉前导符号,改为相对路径格式,比如把/images/Apply/POfId改为images/Apply/POfId - 若图片没有存放在wwwroot目录下,把
DirPath改为你存放图片的根目录绝对路径即可
- 若
- 补全文件后缀
如果数据库存储的PofId不带文件后缀,拼接文件名时手动补全:
string FileName = objdata.PofId + ".jpg";
- 配置文件夹读取权限
右键点击目标文件夹,选择「属性-安全」,添加应用运行账户,授予「读取和执行」「列出文件夹内容」「读取」权限。 - 增加异常前置校验
在打开文件流前增加路径、文件存在校验,避免抛出未处理异常:
var FilePath = Path.Combine(DirPath,WC.ImagePath[1], FileName); // 新增校验逻辑 var dirPath = Path.GetDirectoryName(FilePath); if (!Directory.Exists(dirPath)) { return NotFound("文件目录不存在"); } if (!System.IO.File.Exists(FilePath)) { return NotFound("目标文件不存在"); } var memory = new MemoryStream(); // 原有文件读取逻辑
内容的提问来源于stack exchange,提问作者Azhar Qureshi
相关产品推荐
相关产品推荐

