.NET Core API下载Excel时挪威语特殊字符被替换为下划线
.NET Core API下载含特殊字符文件名Excel乱码问题
问题表现
接口下载Excel文件时,文件名中包含的挪威语特殊字符(ø/æ/ä/å/ö/õ)全部被替换为下划线,核心实现代码:
var filename = doc.Name + Path.GetExtension(filePath); // 预期文件名:Name øæäåöõ.xlsx var contentType = doc.ContentType; return File(stream, contentType, filename, modifiedTime, null);
- 预期结果:下载得到文件名为
Name øæäåöõ.xlsx - 实际结果:下载得到文件名为
Name ______.xlsx - 已尝试操作:参考社区方案手动添加Content-Disposition响应头,问题未解决
- Chrome中查看的响应头截图:

修复方法
问题核心是两个配置缺失,按以下步骤修改即可:
- 先在服务配置阶段放开非ASCII字符的编码限制,在Program.cs的控制器服务注册代码中添加编码配置,需要先引入
System.Text.Encodings.Web和System.Text.Unicode命名空间:
builder.Services.AddControllers() .AddJsonOptions(opt => { opt.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); });
- 不要直接把原始文件名传入
File()方法的下载文件名参数,也不要手动拼接Content-Disposition头,用框架内置的ContentDispositionHeaderValue类做标准编码,自动兼容各浏览器解析规则:
var contentDisposition = new ContentDispositionHeaderValue("attachment"); // FileNameStar 是RFC 5987标准定义的Unicode文件名字段,支持所有非ASCII字符 contentDisposition.FileNameStar = filename; // 兼容不支持RFC 5987的旧浏览器 contentDisposition.FileName = Uri.EscapeDataString(filename); Response.Headers.ContentDisposition = contentDisposition.ToString(); return File(stream, contentType);
手动拼接Content-Disposition头不生效的原因,基本都是没有正确设置
FileNameStar字段,仅设置了仅支持ASCII编码的普通FileName字段,浏览器遇到非ASCII字符就会直接替换为下划线。使用框架内置的类型处理编码,不需要自己处理转义逻辑,不会出现格式不符合规范的问题。
内容的提问来源于stack exchange,提问作者kelsier
相关产品推荐
相关产品推荐

