Pergunta

Ao usar o DotNetZip, é possível obter qual será o tamanho final do arquivo zip antes de chamar Save (stream)?Tenho um site onde os usuários baixam arquivos zip bastante grandes (mais de 2 GB) e gostaria de poder transmitir o arquivo ao usuário em vez de armazená-lo em buffer na memória.Algo assim ...

response.BufferOutput = false;
response.AddHeader("Content-Length", ????);

Isso é possível?

Foi útil?

Solução

Se o fluxo for homogêneo, você pode perder algum tempo compactando uma 'pequena' porção à frente, calculando a taxa de compressão e extrapolando a partir disso.

Se você pretende definir um cabeçalho de comprimento de conteúdo ou algo parecido, isso só pode ser feito quando você (1) escreve um arquivo temporário (aconselhável se houver algum risco de problemas de conexão e clientes solicitando pedaços específicos de qualquer maneira)(2) pode manter o arquivo inteiro na memória (provavelmente apenas em sistemas de 64 bits com memória copiosa)

Claro, você poderia desperdiçar recursos enormes e apenas compactar o stream duas vezes, mas espero que concorde que seria bobagem.

Outras dicas

A maneira de fazer o que você deseja é salvar o arquivo em um arquivo temporário do sistema de arquivos e, em seguida, transmitir o resultado para o usuário.Isso permite que você calcule o tamanho e transmita o arquivo.

Nesse caso, o dotnetzip não salvará o arquivo na memória.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top