保存文件至wwwroot时触发DirectoryNotFoundException问题求助
解决FileStream实例化时的DirectoryNotFoundException异常
这个问题很常见——当你尝试创建文件但目标目录不存在时,FileStream就会抛出DirectoryNotFoundException,因为它不会自动帮你创建缺失的父目录。咱们来一步步修复你的代码:
问题根源
你当前的代码直接拼接出完整文件路径后就尝试创建FileStream,但如果_configuration["SydneyFloorplanPath"]指向的目录(比如WebRootPath/uploads/sydney)还不存在,系统找不到这个目录,自然就会抛出异常。
修复方案
在创建FileStream之前,先提取并确保目标目录存在:
[HttpPost] public IActionResult Upload(string office, IFormFile file) { if (file.Length > 0) { // 拼接完整文件路径 var filePath = Path.GetFullPath(Path.Combine(_environment.WebRootPath, _configuration["SydneyFloorplanPath"])); // 提取文件所在的目录路径 var directoryPath = Path.GetDirectoryName(filePath); // 如果目录不存在则创建(已存在也不会报错) if (!string.IsNullOrEmpty(directoryPath)) { Directory.CreateDirectory(directoryPath); } // 现在可以安全创建FileStream并写入文件了 using (var fileStream = new FileStream(filePath, FileMode.Create)) { file.CopyTo(fileStream); } } return RedirectToAction("Index", new{office = office}); }
额外注意事项
- 确认
_configuration["SydneyFloorplanPath"]的配置值:它应该是包含文件名的完整相对路径(比如"uploads/floorplans/sydney.png")。如果配置的只是目录(比如"uploads/floorplans"),那你需要把上传文件的文件名也拼接进去,否则会把目录当成文件名,导致错误:var filePath = Path.GetFullPath(Path.Combine(_environment.WebRootPath, _configuration["SydneyFloorplanPath"], file.FileName)); Directory.CreateDirectory()是安全的:如果目录已经存在,它不会抛出异常,也不会修改现有目录,所以不用额外做复杂的存在性判断(上面代码里的判断只是为了处理directoryPath为空的极端情况)。
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

