首先,我这里使用的.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);}