.NET Core中下载文件夹内文件时文件名含%2F字符问题求助
解决C# Web API导出Excel时文件名带路径和%2F的问题
这个问题其实挺常见的,核心就是返回文件时没有正确分离文件名和存储路径,导致ASP.NET Core自动把完整路径(包含斜杠,还被URL编码成%2F)当成了文件名返回给浏览器。我给你几个直接可行的解决方案:
1. 使用PhysicalFile时显式指定文件名参数
这是最直接的修复方式,你只需要从完整文件路径中提取纯文件名,然后作为第三个参数传给PhysicalFile方法:
[AllowAnonymous] [HttpGet("ExportExcel")] public async Task<IActionResult> ExportExcel(int activos = 1, int idart...) { // 假设你的文件存储路径是这样的 var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "ExcelExports"); var fileName = "ActivosList.xlsx"; var fullFilePath = Path.Combine(folderPath, fileName); // 生成Excel文件的逻辑...(你的NPOI代码这里不变) // 关键:显式传递纯文件名给PhysicalFile return PhysicalFile(fullFilePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); }
也可以用Path.GetFileName从完整路径中提取文件名,效果完全一致:
var fileName = Path.GetFileName(fullFilePath); return PhysicalFile(fullFilePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
2. 用FileStream返回时指定文件名
如果你是通过文件流返回文件(比如生成Excel后直接写入流),同样要在File方法里指定纯文件名:
using var stream = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read); return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
3. 手动构造Content-Disposition头(进阶方案)
如果上面的方法不生效,你可以直接手动设置响应头,确保浏览器正确识别文件名:
Response.Headers.Add("Content-Disposition", $"attachment; filename=\"{fileName}\""); return PhysicalFile(fullFilePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
问题根源解析
当你不指定PhysicalFile或File方法的第三个文件名参数时,ASP.NET Core会自动从文件路径中解析文件名,但路径中的斜杠/会被URL编码成%2F,浏览器收到后就会把整个编码后的路径当成文件名显示,这就是你遇到的问题。
只要确保传递给响应的是不含路径的纯文件名,就能彻底解决这个问题啦。
内容的提问来源于stack exchange,提问作者ericpap
相关产品推荐
相关产品推荐

