23

だから私は、テキストファイルが生成され、アクションで返されるいくつかの場所を持つMVC 3アプリケーションを持っています:

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

これは素晴らしく機能します。今、私は同様の方法でファイルのペアを返そうとしています。ビューには、「ここをクリックしてこれらの 2 つのファイルを取得する」のようなアクション リンクがあり、上記のコード スニペットで 1 つのファイルがダウンロードされるように、両方のファイルをダウンロードしたいと思います。

どうすればこれを達成できますか?かなり探し回っていますが、この質問がどこにも提起されているのを見たことさえありません...

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/04/10: @Alexが指摘したように、zipは.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

古い質問にぶつかって申し訳ありませんが...

もう 1 つの方法は、 JavaScript を使用して複数のファイル ダウンロードを開始し、ASP.NET 側の 2 つの異なるアクション メソッドでファイルを提供することです。

あなたはリンクがあると言っています:

ビューには、「ここをクリックしてこれらの 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");

.DotNetZipを使用した同等のDOTネット

     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 ストリーミング Zip ファイル

このソリューションの利点は、ファイルをクライアントにストリーミングすることです。

数日前にこのソリューションを実装したところ、うまく機能しました。

于 2012-10-03T20:06:34.477 に答える