Erreur dans Windows Azure lors du téléchargement d'un fichier zip: « ZipException était non gérée » « EOF en-tête »

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

  •  23-09-2019
  •  | 
  •  

Question

J'utilise Windows Azure pour créer un système de gestion des documents, et les choses se sont bien passées jusqu'à présent. Je suis en mesure de télécharger des fichiers sur le stockage BLOB par une extrémité avant asp.net.

Ce que j'essaie de faire est maintenant aux utilisateurs de télécharger un fichier .zip, puis prendre les fichiers de ce .zip et de les enregistrer sous forme de fichiers individuels. Le problème est, je reçois « ZipException était non gérée » « EOF en-tête » et je ne sais pas pourquoi.

J'utilise la bibliothèque ICSharpCode.SharpZipLib que je l'ai utilisé pour beaucoup d'autres tâches et son fonctionnait très bien.

Voici le code de base:

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

et il est sur la ligne qui commence par tout ce que je reçois l'erreur. J'ai ajouté une durée de sommeil de 10 secondes juste pour faire bien sûr le temps était écoulé.

MemStream a une longueur si je déboguer, mais le fait zipInput parfois, mais pas toujours. Il échoue toujours.

Était-ce utile?

La solution

Juste une supposition aléatoire, mais avez-vous besoin de chercher le flux à 0 avant de le lire? Je ne sais pas si vous faites déjà (ou si elle est nécessaire).

Autres conseils

@Smarx indice a fait l'affaire pour moi aussi. La clé pour éviter des fichiers vides dans le zip est de définir la position à zéro. Par souci de clarté est un exemple de code ici qui envoie un flux zip contenant un blob Azure au navigateur.

        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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top