.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);
    }

  

 

posted @ 2024-10-09 20:13  没有星星的夏季  阅读(30)  评论(0编辑  收藏  举报