C#实现下载时弹出文件夹选择框需求及现有代码求助
问题需求
我正在使用C#将多个EMF文件转换为VSDX文件,希望将所有转换后的VSDX文件打包为ZIP文件下载。但我不想直接下载,而是希望弹出下载选择对话框让用户选择文件的保存位置。
现有下载代码
public ActionResult DownloadFile(string filePath) { string id = Convert.ToString(Session["id"]); workingDirectory = HttpContext.Server.MapPath("~"); string fullpath = Path.Combine(workingDirectory, "output", id, "vsdx", filePath); return File(fullpath, MimeTypes.GetMimeType(fullpath), Path.GetFileName(fullpath)); }
解决方案
1. 批量打包VSDX文件为ZIP
利用.NET自带的System.IO.Compression命名空间,将指定目录下的所有VSDX文件打包成ZIP文件。
2. 触发带保存路径选择的下载对话框
通过返回File结果并指定正确的MIME类型和文件名,浏览器会自动弹出保存文件对话框,让用户选择保存位置。
完整实现代码
首先引入必要的命名空间:
using System.IO; using System.IO.Compression;
创建处理ZIP打包和下载的Action方法:
public ActionResult DownloadVsdxZip() { string id = Convert.ToString(Session["id"]); string workingDirectory = HttpContext.Server.MapPath("~"); string vsdxDir = Path.Combine(workingDirectory, "output", id, "vsdx"); // 校验目录和文件是否存在 if (!Directory.Exists(vsdxDir)) { return HttpNotFound("未找到VSDX文件目录"); } string[] vsdxFiles = Directory.GetFiles(vsdxDir, "*.vsdx"); if (vsdxFiles.Length == 0) { return Content("没有可打包的VSDX文件"); } // 生成临时ZIP文件,避免占用应用程序目录空间 string zipName = $"VSDX_Archive_{DateTime.Now:yyyyMMddHHmmss}.zip"; string tempZipPath = Path.Combine(Path.GetTempPath(), zipName); // 执行打包操作,仅保留文件名避免ZIP中包含复杂路径 using (ZipArchive archive = ZipFile.Open(tempZipPath, ZipArchiveMode.Create)) { foreach (string file in vsdxFiles) { string entryName = Path.GetFileName(file); archive.CreateEntryFromFile(file, entryName); } } // 返回ZIP文件,浏览器自动触发保存对话框 var fileResult = File(tempZipPath, "application/zip", zipName); // 可选:异步删除临时ZIP文件,等待文件传输完成后清理 System.Threading.Tasks.Task.Run(() => { System.Threading.Thread.Sleep(5000); if (System.IO.File.Exists(tempZipPath)) { System.IO.File.Delete(tempZipPath); } }); return fileResult; }
关键说明
File方法的第三个参数会自动设置HTTP响应头Content-Disposition: attachment; filename=xxx.zip,这是浏览器弹出保存对话框的核心触发条件- 临时ZIP文件使用系统临时目录,避免污染应用程序目录,后续可通过异步任务自动清理
- 打包时仅保留VSDX文件的文件名,避免ZIP中包含冗余的目录结构
内容的提问来源于stack exchange,提问作者HAREESH PONNAM
相关产品推荐
相关产品推荐

