所以我有一个MVC 3应用程序,它有几个地方生成一个文本文件,并在一个动作中返回:
return File(System.Text.Encoding.UTF8.GetBytes(someString),
"text/plain", "Filename.extension");
这非常有效。现在我有一种情况,我试图以类似的方式返回一对文件。在视图上,我有一个动作链接,如“单击此处获取这两个文件”,我希望下载这两个文件,就像在上面的代码片段中下载单个文件一样。
我怎样才能做到这一点?一直在寻找相当多,甚至没有看到任何地方提出这个问题......
答案 0 :(得分:21)
以Yogendra Singh的想法为基础并使用DotNetZip:
var outputStream = new MemoryStream();
using (var zip = new ZipFile())
{
zip.AddEntry("file1.txt", "content1");
zip.AddEntry("file2.txt", "content2");
zip.Save(outputStream);
}
outputStream.Position = 0;
return File(outputStream, "application/zip", "filename.zip");
更新2019/04/10: 正如@Alex指出的那样,从JitBit和其他人那里开始,自.NET Framework 4.5以来就支持压缩:
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var file1 = archive.CreateEntry("file1.txt");
using (var streamWriter = new StreamWriter(file1.Open()))
{
streamWriter.Write("content1");
}
var file2 = archive.CreateEntry("file2.txt");
using (var streamWriter = new StreamWriter(file2.Open()))
{
streamWriter.Write("content2");
}
}
return File(memoryStream.ToArray(), "application/zip", "Images.zip")
}
答案 1 :(得分:4)
我建议创建一个zip
文件,使用步骤包含这两个文件(ALGORITHM):
Java语法(仅供理解)
FileOutputStream fos = new FileOutputStream("downloadFile.zip");
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
zos.putNextEntry(new ZipEntry("Filename1.extension"+));
//write data in FileName1.extension
zos.write(contentBuffer1, 0, len);
zos.putNextEntry(new ZipEntry("Filename2.extension"));
//write data in FileName2.extension
zos.write(contentBuffer2, 0, len);
//write other files.....
zos.close();
创建zip
文件后,返回新创建的zip
文件进行下载。
return File("downloadFile.zip");
.DOT Net Equivalent使用DotNetZip
var os = new MemoryStream();
using (var zip = new ZipFile())
{
//write the first file into the zip
zip.AddEntry("file1.txt", "content1");
//write the second file into the zip
zip.AddEntry("file2.txt", "content2");
//write other files.....
zip.Save(os);
}
outputStream.Position = 0;
return File(outputStream, "application/zip", "filename.zip");
希望这有帮助!
答案 2 :(得分:3)
很抱歉碰到一个旧问题,但......
另一种选择是使用JavaScript启动多个文件下载,并在ASP.NET的两个不同的Action方法中提供文件。
你说你有一个链接:
在视图中,我有一个类似&#34的动作链接;点击此处获取那些2 文件"
所以建立这样的链接:
<a href="#" onclick="downloadFile(url1); downloadFile(url2);">Click to get 2 files</a>
<script src="download.js"></script>
我使用download.js
脚本找到here,但您可以找到许多不同的其他选项,请参阅此问题:例如starting file download with JavaScript
答案 3 :(得分:1)