Erro no Windows Azure Ao fazer o upload de um arquivo zip: “Zipexception foi ilegal” “EOF no cabeçalho”

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

  •  23-09-2019
  •  | 
  •  

Pergunta

Eu tenho usado o Windows Azure para criar um sistema de gerenciamento de documentos e as coisas correram bem até agora. Consegui fazer upload e baixar arquivos para o armazenamento do BLOB através de um front end ASP.NET.

O que estou tentando fazer agora é permitir que os usuários enviem um arquivo .zip e, em seguida, retire os arquivos desse .zip e salve -os como arquivos individuais. O problema é que estou recebendo "Zipexception não foi tratado" "EOF no cabeçalho" e não sei o porquê.

Estou usando a biblioteca icsharpcode.sharpziplib que usei para muitas outras tarefas e funcionou muito bem.

Aqui está o código básico:

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

E está na linha que começa enquanto eu recebo o erro. Adicionei uma duração do sono de 10 segundos apenas para garantir que o tempo suficiente tivesse passado.

O MemStream tem um comprimento se eu depurar, mas o zipinput às vezes, mas nem sempre. Sempre falha.

Foi útil?

Solução

Apenas um palpite aleatório, mas você precisa procurar o fluxo de volta para 0 antes de lê -lo? Não tenho certeza se você já está fazendo isso (ou se é necessário).

Outras dicas

@Smarx dica fez o truque para mim também. A chave para evitar arquivos vazios dentro do zip é definir a posição como zero. Por uma questão de clareza aqui está o código de amostra que envia um Zip-Stream contendo uma bolha do Azure para o 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top