.NetCore中下载文件接口指定文件名时中文被替换为下划线(_)的问题
首先,我这里使用的.net6
比如我有这样一个接口:
public async Task<IActionResult> Download(string name)
{
//省略业务代码...
return File(stream, "application/octet-stream", name);
}
这里下载的文件名时接口参数传进来的,然后我们调用接口,发现当我传的是文件名中包含中文时,会被替换为下划线(_):
其实,查看源码,发现这是有意为之。
在ContentDispositionHeaderValue
中,有如下代码处理(这里)
// Replaces characters not suitable for HTTP headers with '_' rather than MIME encoding them.
private StringSegment Sanitize(StringSegment input)
{
var result = input;
if (RequiresEncoding(result))
{
var builder = new StringBuilder(result.Length);
for (int i = 0; i < result.Length; i++)
{
var c = result[i];
if ((int)c > 0x7f || (int)c < 0x20)
{
c = '_'; // Replace out-of-range characters
}
builder.Append(c);
}
result = builder.ToString();
}
return result;
}
这段代码其实就是要求文件名是ASCII编码中的33到126部分,就是一些常用的字符,否则使用下划线代替,也就是说不只是中文,包括空格等其它的一些字符也会被替换。
那怎么处理这个问题呢?很简单,UrlEncode
处理一下就好了:
public async Task<IActionResult> Download(string name)
{
//省略业务代码...
name = HttpUtility.UrlEncode(name);
return File(stream, "application/octet-stream", name);
}
一个专注于.NetCore的技术小白
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY