2017-03-08 13 views
-1

誰もがZIPファイルを返すのを知っていて、そこに含まれているファイルを開いても開くことができず、ファイルが破損しているとわかり、次のメソッドを理解し、 ?貢献できる人に 多くのおかげで、それは私のコントローラのメソッドです:ファイルをzipに追加してMVC5をダウンロードする

Public FileResult Download() 
     { 
      List <String> codes = new List <string>(); 
      Codes.Add ("1079"); 
      Codes.Add ("1078"); 
      Codes.Add ("1077"); 
      MemoryStream ms = new MemoryStream(); ; 
      Using (var zip = new ZipArchive (ms, ZipArchiveMode.Create, true)) 
      { 
       Foreach (string codigoGar in codes) 
       { 
        String mimetypeOfFile = ""; 
        Guarantees oGarantia = ControllerGarantias.getGarantia (SessionHelper.GetEntorno(), codeGar); 
        Var stream = new MemoryStream (oGarantia.comprobante); 


        Byte [] buffer = new byte [1024]; 
        If (stream.Length> = 1024) 
         Stream.Read (buffer, 0, 1024); 
        Else 
         Stream.Read (buffer, 0, (int) stream.Length); 

        Try 
        { 
         System.UInt32 mimetype; 
         FindMimeFromData (0, null, buffer, 1024, null, 0, out mimetype, 0); 
         System.IntPtr mimeTypePtr = new IntPtr (mimetype); 
         MimetypeOfFile = Marshal.PtrToStringUni (mimeTypePtr); 
         Marshal.FreeCoTaskMem (mimeTypePtr); 

         String fileName = ""; 

         If (! String.IsNullOrEmpty (mimetypeOfFile)) 
         { 
          Switch (mimetypeOfFile.ToLower()) 
          { 
           Case "application/pdf": 
            FileName = "Voucher_" + oGarantia.ServiceName + "_" + oGarantia.nroFactura + ".pdf"; 
            Break; 
           Case "image/x-png": 
            FileName = "Voucher_" + oGarantia.ServiceName + "_" + oGarantia.nroFactura + ".png"; 
            Break; 
           Case "image/pjpeg": 
            FileName = "Voucher_" + oGarantia.ServiceName + "_" + oGarantia.nroFactura + ".jpg"; 
            Break; 
          } 
         } 
         Var entry = zip.CreateEntry (fileName, CompressionLevel.Fastest); 

         Using (MemoryStream fileStream = stream) 
         Using (var entryStream = entry.Open()) 
         { 
          FileStream.CopyTo (entryStream); 
         } 
        } 
        Catch (Exception e) 
        { 
         Return null; 
        } 
       } 
      } 
      Return File (ms.ToArray(), "application/zip", "VouchersGuarantees.zip"); 
     } 

とJavaScriptからそれを呼び出すために、私は次の行を使用します。

Window.location.href = '@ Url.Action ("Download",' Warranties ')'; 
+0

アイデアは、ビュー内のチェックボックスでテーブル内の特定の選択されたコードを取得し、データベースレコード、各コードの情報を検索するメソッドをコントローラに作成することですSQL、varbinaryのように。その後、それぞれの目的のために、ファイルをzip形式で作成してダウンロードできるようにします。ありがとう! –

答えて

0

を私はあなたのサンプルコードを提供しますそのzipファイルと作業、あなたはそれにあなたのコードを適応させることができます。

まず、DotNetZipライブラリをインストールする必要があります。

public FileResult Download() 
     { 
      // using DotNetZip library 
      using (ZipFile zip = new ZipFile()) 
      { 
       // your files (or you can just pull the byte arrays and filenames from your database) 
       var file1 = Server.MapPath("~/archivosDescargar/ejemplo 1.pdf"); 
       var file2 = Server.MapPath("~/archivosDescargar/ejemplo 2.pdf"); 
       var file3 = Server.MapPath("~/archivosDescargar/1080.png"); 

       var fileName1 = Path.GetFileName(file1); 
       var byteArray1 = System.IO.File.ReadAllBytes(file1); 
       var fileName2 = Path.GetFileName(file2); 
       var byteArray2 = System.IO.File.ReadAllBytes(file2); 
       var fileName3 = Path.GetFileName(file3); 
       var byteArray3 = System.IO.File.ReadAllBytes(file3); 

       // This adds each file to the zip 
       zip.AddEntry(fileName1, byteArray1); 
       zip.AddEntry(fileName2, byteArray2); 
       zip.AddEntry(fileName3, byteArray3); 

       using (MemoryStream output = new MemoryStream()) 
       { 
        zip.Save(output); 
        return File(output.ToArray(), "application/zip", "sample9.zip"); 
       } 
      } 
     } 
+0

ありがとうFelipeGavilàn。私はこれらの図書館で試してみて、あなたにコメントします! –

+0

何が悪いのか、私は同じ結果を得ました、何が起こっているのかわからない、とにかく、私は見続けるでしょう。 –

+0

私のコードであなたを示したように、ディレクトリ内のpdfの簡単な例を試しましたか? –

0

まあ私は最終的にエラーが見つかりました、そして、私は悪いzipエントリを作成していた。私はメモリストリームと、次の方法でそれをやっていた:

zip.AddEntry(fileName, stream); 

次のようにそれがあるべきときは、バイトで[]:

zip.AddEntry(fileName, oGarantia.comprobante); 

あなたの例フェリペGavilánは私をたくさん助け、多くのおかげですべてのサポートのために。

関連する問題