23

所以我有一个 MVC 3 应用程序,它有几个地方生成文本文件并在操作中返回:

return File(System.Text.Encoding.UTF8.GetBytes(someString),
                 "text/plain", "Filename.extension");

这非常有效。现在我遇到了一种情况,我试图以类似的方式返回一对文件。在视图中,我有一个操作链接,例如“单击此处获取这 2 个文件”,我希望下载这两个文件,就像在上面的代码片段中下载单个文件一样。

我怎样才能做到这一点?一直在搜索,甚至没有看到任何地方提出这个问题......

4

4 回答 4

35

基于 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 年4 月 10 日更新: 正如 @Alex 所指出的,自 .NET Framework 4.5 起,来自JitBit和其他人的本地支持压缩:

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")
}
于 2013-02-21T02:12:20.680 回答
5

很抱歉碰到一个老问题,但是......

另一种选择是使用 JavaScript 启动多个文件下载,并在 ASP.NET 端以两种不同的操作方法提供文件。

你说你有一个链接:

在视图中,我有一个操作链接,例如“单击此处获取这 2 个文件”

所以让这个链接像这样:

<a href="#" onclick="downloadFile(url1); downloadFile(url2);">Click to get 2 files</a>
<script src="download.js"></script>

我正在使用此处download.js找到的脚本,但您可以找到许多不同的其他选项,请参阅这个 SO 问题:例如使用 JavaScript 开始文件下载

于 2016-11-23T00:14:15.290 回答
4

我建议zip使用步骤(算法)创建一个文件以包含这两个文件:

  1. 创建一个 Zip 文件并将所需文件添加到 zip 中
  2. 从操作中返回包含所有所需文件的 zip 文件

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 网络等效使用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");

希望这可以帮助!

于 2012-10-03T17:37:31.460 回答
1

看看这个 SO 解决方案: MVC Streaming Zip File

此解决方案的优点是它将文件流式传输到客户端。

几天前我刚刚实施了这个解决方案,效果非常好。

于 2012-10-03T20:06:34.477 回答