C# 下载由 Web 应用程序创建的文件的 zip 存档

本文关键字:文件 zip 存档 创建 应用程序 下载 Web | 更新日期: 2023-09-27 18:22:14

using Ionic.Zip
...
using (ZipFile zip = new ZipFile())
    {
        zip.AlternateEncodingUsage = ZipOption.AsNecessary;
        zip.AddDirectoryByName("Files");
        foreach (GridViewRow row in GridView1.Rows)
        {
            if ((row.FindControl("chkSelect") as CheckBox).Checked)
            {
                string filePath = (row.FindControl("lblFilePath") as Label).Text;
                zip.AddFile(filePath, "Files");
            }
        }
        Response.Clear();
        Response.BufferOutput = false;
        string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName); 
        zip.Save(Response.OutputStream);
        Response.End();
    }

你好!这部分代码用于下载压缩目录。假设我有一个要下载的文本文件内容的网格视图。有没有办法让程序在不知道或写入文件路径的情况下下载这样的架构?

代码应按以下方式工作:

1. get item from gridview 
2. create a text file from the content
3. add it to the zip directory
(repeat foreach item in gridview)
n. download a zipped file

C# 下载由 Web 应用程序创建的文件的 zip 存档

根据文档,您可以从Stream中添加条目。 因此,请考虑您当前在哪里执行此操作:

zip.AddFile(filePath, "Files");
与其在给定

路径的情况下添加"文件",不如在给定数据流的情况下添加"文件"。

因此,您可以从字符串创建流:

new MemoryStream(Encoding.UTF8.GetBytes(someString)) // or whatever encoding you use

并将其添加到 Zip 中:

using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(someString)))
{
    zip.AddEntry(someFileName, stream);
    // other code
    zip.Save(Response.OutputStream);
}

这里要注意的一件事是,您的资源管理和处置(使用 using 块(可能会变得有点棘手。 这是因为,根据文档:

应用程序应该提供一个开放的、可读的流;在这种情况下,它将在调用 Save(( 或其重载之一期间被读取。

这意味着,如果您在调用.Save()之前释放任何流,则调用它时它将失败。 您可能希望进一步查看文档,看看是否有办法强制 Zip 在此过程的早期读取流。 否则,您基本上将不得不管理一堆打开的流,直到需要"保存"Zip。

<小时 />

编辑:看起来文档就在那里...

在将大量流添加到 ZipFile 的情况下,应用程序可能希望避免同时保持所有流处于打开状态。若要处理这种情况,应用程序应使用 AddEntry(String、OpenDelegate、CloseDelegate(重载。

这将稍微复杂一些,并且需要您在委托中手动打开/关闭/处置流。 因此,在构建逻辑时,这取决于您这是否比嵌套using块更可取。 这可能取决于您计划使用的流数量。