.NetCore中下載文件接口指定文件名時中文被替換為下劃線(_)的問題
??首先,我這里使用的.net6
??比如我有這樣一個接口:
public async Task<IActionResult> Download(string name)
{
//省略業(yè)務代碼...
return File(stream, "application/octet-stream", name);
}
??這里下載的文件名時接口參數(shù)傳進來的,然后我們調用接口,發(fā)現(xiàn)當我傳的是文件名中包含中文時,會被替換為下劃線(_):
??
??其實,查看源碼,發(fā)現(xiàn)這是有意為之。
??在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)
{
//省略業(yè)務代碼...
name = HttpUtility.UrlEncode(name);
return File(stream, "application/octet-stream", name);
}
??
一個專注于.NetCore的技術小白

浙公網(wǎng)安備 33010602011771號