De error en Windows Azure al subir un archivo zip: “ZipException fue no controlada” “EOF en el encabezado”

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

  •  23-09-2019
  •  | 
  •  

Pregunta

He estado usando Windows Azure para crear un sistema de gestión de documentos, y las cosas han ido bien hasta ahora. He sido capaz de archivos de carga y descarga en el almacenamiento BLOB través de un extremo frontal asp.net.

Lo que estoy tratando de hacer ahora es permitir a los usuarios cargar un archivo .zip, y luego tomar los archivos de ese .zip y guardarlas como archivos individuales. El problema es que estoy recibiendo "ZipException fue no controlada" "EOF en la cabecera" y no sé qué.

Estoy usando la biblioteca ICSharpCode.SharpZipLib la que he utilizado para muchas otras tareas y su gran trabajados.

Este es el código básico:

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

y está en la línea que comienza con mientras que consigo el error. He añadido una duración del sueño de 10 segundos sólo para asegurarse de suficiente tiempo había pasado.

MemStream tiene una longitud si depurarlo, pero el zipInput hace a veces, pero no siempre. Siempre falla.

¿Fue útil?

Solución

Sólo una conjetura al azar, pero no es necesario buscar la parte posterior flujo a 0 antes de leerlo? No está seguro de si está haciendo que ya (o si es necesario).

Otros consejos

@Smarx pista hizo el truco para mí también. La clave para evitar archivos vacíos dentro del zip es para ajustar la posición de cero. En aras de la claridad aquí es código de ejemplo que envía una cremallera corriente que contiene una mancha azul en el navegador.

        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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top