.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的技术小白