Fehler in Windows Azure als eine ZIP-Datei hochgeladen werden: in header „ZipException wurde nicht behandelt“ „EOF“

StackOverflow https://stackoverflow.com/questions/2547481

  •  23-09-2019
  •  | 
  •  

Frage

Ich habe mit Windows Azure einem Dokumenten-Management-System zu schaffen, und die Dinge sind gut, so weit gegangen. Ich habe zu Upload- und Download-Dateien in dem BLOB-Speicher durch eine asp.net Frontend der Lage gewesen.

Was ich versuche jetzt zu tun ist, die Benutzer erlauben, eine ZIP-Datei zu laden, und nehmen Sie dann die Dateien aus dieser .zip und speichern Sie sie als einzelne Dateien. Das Problem ist, ich bin immer „ZipException wurde nicht behandelt“ „EOF in Header“ und ich weiß nicht, warum.

Ich verwende die ICSharpCode.SharpZipLib Bibliothek, die ich für viele andere Aufgaben und seine gearbeitete großen benutzt habe.

Hier ist der grundlegende Code:

CloudBlob ZipFile = container.GetBlobReference(blobURI);
MemoryStream MemStream = new MemoryStream();
ZipFile.DownloadToStream(MemStream);
....
while ((theEntry = zipInput.GetNextEntry()) != null)

und es ist auf der Linie, dass beginnt mit während, dass ich den Fehler. Ich habe eine Schlafdauer von 10 Sekunden nur sicher genug Zeit war gegangen zu machen.

hat MemStream eine Länge, wenn ich es zu debuggen, aber die zipInput tut manchmal, aber nicht immer. Es schlägt immer fehl.

War es hilfreich?

Lösung

Nur eine zufällige Vermutung, aber tun Sie müssen den Strom wieder auf 0 suchen, bevor Sie es lesen? Nicht sicher, ob Sie tun das schon (oder wenn es notwendig ist).

Andere Tipps

tat @Smarx Hinweis den Trick auch für mich. Der Schlüssel zur Vermeidung von Leer Dateien im Zip ist die Position auf Null zu setzen. Aus Gründen der Übersichtlichkeit hier ist Beispielcode, der einen Zip-Strom, der einen Azure Blob an den Browser sendet.

        var fs1 = new MemoryStream();
        Container.GetBlobReference(blobUri).DownloadToStream(fs1);
        fs1.Position = 0;

        var outputMemStream = new MemoryStream();
        var zipStream = new ZipOutputStream(outputMemStream);

        var entry1 = new ZipEntry(fileName);
        zipStream.PutNextEntry(entry1);
        StreamUtils.Copy(fs1, zipStream, new byte[4096]);
        zipStream.CloseEntry();

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + zipFileName);
        Response.OutputStream.Write(outputMemStream.ToArray(), 0, outputMemStream.ToArray().Length);
        Response.End();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top