2016-06-29 21 views
0

Ich habe eine Reihe von Jpg-Bildern in Byte-Array-Form. Ich möchte diese zu einer Zip-Datei hinzufügen, die Zip-Datei in ein Byte-Array umwandeln und es an einen anderen Ort weiterleiten. Bei einem Verfahren, habe ich diesen Code:Byte-Array wird beschädigt, wenn an eine andere Methode übergeben

var response = //some response object that will hold a byte array 

    using (var ms = new MemoryStream()) 
    { 
     using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 
     { 
      var i = 1; 
      foreach (var image in images) // some collection that holds byte arrays. 
      { 
       var entry = zipArchive.CreateEntry(i + ".jpg"); 

       using (var entryStream = entry.Open()) 
       using (var compressStream = new MemoryStream(photo.ImageOriginal)) 
       { 
        compressStream.CopyTo(entryStream); 
       } 
        i++; 
      } 
      response.ZipFile = ms.ToArray(); 
     } 

    using (var fs = new FileStream(@"C:\Users\MyName\Desktop\image.zip", FileMode.Create)) 
     { 
      ms.Position = 0; 
      ms.CopyTo(fs); 
     } 
    } 

    return response; 

Jetzt habe ich eine Filestream in der Nähe der Unterseite hinzugefügt, um es zu einer Zip-Datei zu schreiben, sofort zu Testzwecken. Das funktioniert, ich bekomme eine Zip-Datei mit 1 oder mehr Bildern auf meinem Desktop. Allerdings: response.ZipFile kann nicht auf dieselbe Weise in eine gültige ZIP-Datei umgewandelt werden. Ich habe es versucht:

using (var ms2 = new MemoryStream(response.ZipFile)) 
using (var fs = new FileStream(@"C:\Users\Bara\Desktop\image.zip", FileMode.Create)) 
{ 
    ms2.Position = 0; 
    ms2.CopyTo(fs); 
} 

Aber das erstellt eine ZIP-Datei, die nicht geöffnet werden kann.

Was ich versuche zu tun: Drehen Sie response.ZipFile in ein Array, das wieder in eine funktionierende ZIP-Datei verwandelt werden kann. Was mache ich falsch in diesem Code?

+0

Es bizarr scheint einen neuen 'MemoryStream' zu konstruieren, das Objekt nur in der Lage sein,' zu nennen CopyTo', wenn Sie Ihr Byte-Array einfach direkt in den Zielstream schreiben können. –

+0

Deshalb bin ich immer noch ein Student und du bist ein Meister. :-) – ohyeah

Antwort

2

Woher wissen Sie, dass ZipArchiveDispose nicht mehr in den zugrunde liegenden Stream schreibt?

Sie diese Zeile den ZipArchive nach Entsorgung bewegen soll:

response.ZipFile = ms.ToArray(); 

Voll Code:

var response = //some response object that will hold a byte array 

using (var ms = new MemoryStream()) 
{ 
    using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 
    { 
     var i = 1; 
     foreach (var image in images) // some collection that holds byte arrays. 
     { 
      var entry = zipArchive.CreateEntry(i + ".jpg"); 

      using (var entryStream = entry.Open()) 
      using (var compressStream = new MemoryStream(photo.ImageOriginal)) 
      { 
       compressStream.CopyTo(entryStream); 
      } 
      i++; 
     } 
    } 
    response.ZipFile = ms.ToArray(); 
} 

return response; 
+0

Behoben für mich, danke! Ich habe immer noch Probleme, die Konzepte der Ströme zu verstehen, sonst wäre das nicht passiert. – ohyeah