从MVC操作返回多个文件

时间:2012-10-03 17:27:14

标签: asp.net asp.net-mvc asp.net-mvc-3 download

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

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

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

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

4 个答案:

答案 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):

  1. 创建一个Zip文件并将所需文件添加到zip
  2. 从操作
  3. 返回包含所有所需文件的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 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)

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

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

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