asp.net - asp net mvc イニシャライザ 難しい



MVCアクションから複数のファイルを返す (3)

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以降、zippingはネイティブにサポートされています。

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")
}

https://ffff65535.com

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

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

そしてこれはすばらしい働きをします。 今、私は同じような方法でファイルのペアを返そうとしている状況を持っています。 このビューでは、「ここをクリックしてこれらの2つのファイルを取得する」などのアクションリンクがあり、両方のファイルを1つのファイルが上記のコードスニペットでダウンロードされるのと同じようにダウンロードします。

どうすればこれを達成できますか? かなり周りを検索していても、この質問がどこにも見られていないのですが...


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

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

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

ビューでは、私は "それらの2つのファイルを取得するにはここをクリックしてください"のようなアクションリンクを持っています

だからこのようにこのリンクを作る:

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

here download.jsスクリプトを使用しhereいますが、他にもさまざまなオプションがあります。この質問を参照してください。たとえばJavaScriptでファイルのダウンロードを開始する


私はステップを使用して両方のファイルを含めるために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");

お役に立てれば!





download