Erro no Windows Azure Ao fazer o upload de um arquivo zip: “Zipexception foi ilegal” “EOF no cabeçalho”
-
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.
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();