You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.Net中MIME下载及Zip打包时非英文文件名文件缺失问题

问题分析与修复方案

一、问题根源

  1. 非英文文件名下载失败:默认ContentDisposition.ToString()不会对非ASCII文件名做正确编码,浏览器无法解析;
  2. Zip包内特定文件缺失:旧版Zip流库(如SharpZipLib)默认使用CP437编码,不支持Unicode文件名(韩文、中文混合这类),导致文件名无法被正确识别,最终被Zip工具忽略。

二、具体修复步骤

1. 修复Zip包内Unicode文件名丢失

如果使用SharpZipLib的ZipOutputStream,需强制开启UTF-8编码支持:

  • 给ZipOutputStream指定UTF-8编码
  • 标记ZipEntry为Unicode文本类型

2. 修复Content-Disposition头编码

不能直接依赖ContentDisposition.ToString(),手动构造兼容多浏览器的响应头,采用RFC 5987标准编码文件名。

3. 代码潜在问题修正

  • 确保count变量初始化,避免索引越界
  • 添加流关闭/完成操作,保证Zip数据完整写入

三、修改后的完整代码

long[] fileIds = JsonConvert.DeserializeObject<long[]>(fileIdsStr);
string[] fs_FileNames = JsonConvert.DeserializeObject<string[]>(FileNamesStr);
int count = 0; // 初始化计数器

// 配置ZipOutputStream为UTF-8编码
ZipOutputStream zipMemoryStream1 = new ZipOutputStream(Response.OutputStream)
{
    Encoding = Encoding.UTF8,
    UseUnicodeAsNecessary = true
};
int chunkSize = 1024;
string contentType = MimeMapping.GetMimeMapping("download_zip.zip");

foreach (long fileId in fileIds)
{
    if (count >= fs_FileNames.Length) break; // 防止索引越界
    string fileName = fs_FileNames[count];
    string fileData = this.getFileData(fileId);
    
    var bytes = Convert.FromBase64String(fileData);

    var zipEntry = new ZipEntry(fileName)
    {
        IsUnicodeText = true // 标记文件名使用Unicode
    };
    zipMemoryStream1.PutNextEntry(zipEntry);
    zipMemoryStream1.Write(bytes, 0, bytes.Length);
    zipMemoryStream1.CloseEntry(); // 关闭当前条目,避免数据残留
    count++;
}

// 手动构造兼容多浏览器的Content-Disposition头
string encodedFileName = System.Web.HttpUtility.UrlEncode("download.zip", Encoding.UTF8);
string contentDisposition = $"attachment; filename=\"{encodedFileName}\"; filename*=UTF-8''{encodedFileName}";
Response.AppendHeader("Content-Disposition", contentDisposition);
Response.BufferOutput = false;

// 完成Zip流写入并关闭
zipMemoryStream1.Finish();
zipMemoryStream1.Close();

return File(Response.OutputStream, contentType);

四、关键说明

  • Zip文件名处理:通过Encoding.UTF8和IsUnicodeText = true,确保韩文、中文混合的文件名能被Zip工具正确识别,解决目标文件缺失问题;
  • 响应头兼容:同时提供filename和filename*参数,覆盖新旧浏览器的编码解析需求;
  • 流完整性:添加CloseEntry()和Finish()操作,保证Zip包数据完整,避免损坏。

内容的提问来源于stack exchange,提问作者Chundya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:09:29