创建文本文件,将它们压缩到 ZipArchive 中并提供以供下载
Create text files, compress them to a ZipArchive and present it for download
我的场景:
- asp.net mvc 网络应用程序
- 用户点击视图中的按钮开始操作
操作:
- 根据存储在 sql db
的表中的记录创建多个 csv 文件
- 将所有创建的文件压缩到一个 ZipArchive
- 提交 ZipArchive 以下载到客户端计算机
我有一个工作代码,用于创建单个 csv 文件并提供下载。
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() 只是将生成的字符串定向到浏览器,最终在用户单击保存时将其转换为文件。
问题:
- 必须先将响应保存到文件才能将其添加到 ZipArchive 中吗?
如果是,
- 如何将通过代码的响应转换为文件?
- 有什么方法可以跳过写入物理文件以将其放入 ZipArchive 中吗?
下面是我的示例解决方案(用于压缩 2 个文件)
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();
}
我的场景:
- asp.net mvc 网络应用程序
- 用户点击视图中的按钮开始操作
操作:
- 根据存储在 sql db 的表中的记录创建多个 csv 文件
- 将所有创建的文件压缩到一个 ZipArchive
- 提交 ZipArchive 以下载到客户端计算机
我有一个工作代码,用于创建单个 csv 文件并提供下载。
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() 只是将生成的字符串定向到浏览器,最终在用户单击保存时将其转换为文件。
问题:
- 必须先将响应保存到文件才能将其添加到 ZipArchive 中吗?
如果是,
- 如何将通过代码的响应转换为文件?
- 有什么方法可以跳过写入物理文件以将其放入 ZipArchive 中吗?
下面是我的示例解决方案(用于压缩 2 个文件)
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();
}