// 对文件名进行 UTF-8 URL 编码,避免中文或特殊字符乱码
string encodedFileName = Uri.EscapeDataString(Name.Trim());
// 同时兼容现代浏览器 (filename*) 和老浏览器 (filename)
Response.AddHeader("Content-Disposition",
$"attachment; filename=\"{Name}\"; filename*=UTF-8''{encodedFileName}");
// 设置文件长度(便于浏览器显示下载进度)
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
// 声明是二进制下载
Response.AddHeader("Content-Transfer-Encoding", "binary");
// 告诉浏览器是个二进制文件(触发下载)
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.UTF8;
// 将文件写入响应流
// Response.WriteFile(fileInfo.FullName); 此方法会将整个文件读入内存,不应使用。
// ✅ 使用 TransmitFile 不会占用托管内存
Response.TransmitFile(fileInfo.FullName);
// 强制将缓冲区内容立即发送到客户端
Response.Flush();
// 关闭连接
Response.Close();
其中,如果省略“对文件名进行 UTF-8 URL 编码”步骤,会导致某些移动端浏览器下载文件时获取不到正确的文件名。


