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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:31:08