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

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号