首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建文本文件,将其压缩为ZipArchive并呈现供下载

问创建文本文件,将其压缩为ZipArchive并呈现供下载
EN

Stack Overflow用户
提问于 2018-01-24 14:16:27
回答 1查看 2.8K关注 0票数 2

我的场景:

  1. asp.net mvc web应用程序
  2. 用户单击视图中的按钮以启动操作。

操作:

  1. 从存储在sql db表中的记录创建多个csv文件。
  2. 将所有创建的文件压缩到一个ZipArchive中
  3. 显示要下载到客户端计算机的ZipArchive

我有一个工作代码,用于创建单个csv文件并将其呈现供下载。

代码语言:javascript
复制
    public class ExportCSVController : BaseController
    {

    public ExportCSVController(IUnitOfWork unitOfWork)
    {
        UnitOfWork = unitOfWork;
    }
    public void ExportCSV_Company()
    {
        var sb = new StringBuilder();

        var companies = UnitOfWork.GetAll<Company>();
        var list = companies.ToList();
        sb.AppendFormat("{0};{1};{2}{3};{4}", "Name", "Street", "City", "Zipcode", Environment.NewLine);
        foreach (var item in list)
        {
            sb.AppendFormat("{0};{1};{2};{3};{4}", "\"" + item.Name + "\"", item.Street, item.City, item.Zip, Environment.NewLine);
        }
        //Get Current Response
        var response = System.Web.HttpContext.Current.Response;
        response.BufferOutput = true;
        response.Clear();
        response.ClearHeaders();
        response.ContentEncoding = Encoding.Unicode;
        response.AddHeader("content-disposition", "attachment;filename=Companies.txt ");
        response.ContentType = "text/plain";
        response.Write(sb.ToString());
        response.End();
    }
    }

我还有一个将文件压缩到ZipArchive (使用System.IO.Compression)的工作代码。

我的想法:

  • 为每个需要生成的文件设置一个循环(在我的工作代码中)。
  • 生成第一个文件后,将该文件添加到ZipArchive (使用System.IO.Compression)
  • 继续下一个文件生成,并将该文件附加到ZipArchive .
  • 然后呈现ZipArchive供下载。

我的问题是:

  • 我不太明白在给定的代码中文件是在哪里生成的,如果有的话?我认为,response.Write()只是将生成的字符串定向到浏览器,在浏览器中,当用户单击保存时,它最终被转换为文件。

问题:

  1. 在将响应添加到ZipArchive之前,必须将响应保存到文件中吗?

如果是,

  1. 如何通过代码将响应转换为文件?
  2. 是否有任何方法可以跳过编写物理文件以使其进入ZipArchive?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 11:17:18

下面是我的示例解决方案(用于压缩2个文件)

代码语言:javascript
复制
public void ExportFilesToZip()
{
    string zipFileName = "Test.zip";
    string firstFileName = "FirstFile.txt";
    string secondFileName = "SecondFile.txt";
    string firstFileContent ="1";
    string secondFileContent ="2";

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.AddHeader("content-disposition", "attachment;filename=" + zipFileName);

    using (var memoryStream = new MemoryStream())
    {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
            var demoFile = archive.CreateEntry(firstFileName);

            using (var entryStream = demoFile.Open())
            using (var streamWriter = new StreamWriter(entryStream))
            {
                streamWriter.Write(firstFileContent);
            }

            demoFile = archive.CreateEntry(secondFileName);

            using (var entryStream = demoFile.Open())
            using (var streamWriter = new StreamWriter(entryStream))
            {
                streamWriter.Write(secondFileContent);
            }
        }

        using (var fileStream = Response.OutputStream)
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
    }

    Response.End();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48424604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档