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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:26:01