从MVC操作返回多个文件(Returning Multiple Files from MVC Act

2019-06-18 10:22发布

所以我有一个MVC 3应用程序,它具有这样一个文本文件被生成和使用动作返回了几个地方:

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

这一点也适用惊人。 现在我已经得到了在那里我试图返回一个对文件以类似的方式的情况。 在视图中,我有一个像操作链接“点击这里获取的2个文件”,我想这两个文件被下载很像一个文件是在上面的代码片断下载。

我怎样才能做到这一点? 一直在寻找周围颇有几分甚至还没有见过任何地方提出了这个问题...

Answer 1:

建立在约根德拉·辛格的理念和使用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框架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")
}


Answer 2:

我会建议创建一个zip文件,既包括使用步骤(算法)的文件:

  1. 创建一个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");

希望这可以帮助!



Answer 3:

对不起,撞到一个老问题,但...

另一种方法是启动使用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例如



Answer 4:

看看这个做方案: MVC流Zip文件

该方案的优点是,它流的文件给客户端。

我只是实现了这个解决方案前两天,它的工作太棒了。



文章来源: Returning Multiple Files from MVC Action