Pergunta

Eu estou criando algo que inclui um serviço de upload de arquivos do tipo, e eu preciso armazenar dados compactados com compressa de zlib () função. Eu enviá-lo através da internet já compactado, mas eu preciso saber o tamanho do arquivo descompactado no servidor remoto. Existe alguma maneira que eu possa descobrir esta informação sem uncompress () ing os dados no servidor em primeiro lugar, apenas para a eficiência? Isso é como eu estou fazendo isso agora, mas se há um atalho Eu adoraria levá-la.

A propósito, por que é chamado de descompressão? Isso soa muito terríveis para mim, eu sempre pensei que seria descomprimir ...

Foi útil?

Solução

O formato zlib não tem um campo para o tamanho de entrada original, então eu duvido que você vai ser capaz de fazer isso sem simular uma descompressão dos dados. A gzip formato tem um "tamanho de entrada" (ISIZE) campo, que você poderia usar, mas talvez você queira evitar a alteração do formato de compressão ou de ter os clientes de enviar o tamanho do arquivo.

Mas mesmo se você usar um formato diferente, se você não confiar nos clientes que você ainda precisa para executar um teste mais caro para ter certeza de que os dados não comprimidos é o tamanho que o cliente diz que é. Neste caso, o que você pode fazer é fazer com que o descomprimir-to- / dev / null processo menos dispendioso, certificando-se zlib não escreve os dados de saída em qualquer lugar, como você só quer saber o tamanho descompactado.

Outras dicas

duvido. Eu não acredito que isso é algo que as bibliotecas zlib subjacentes fornecer a partir da memória (embora foi uma boa 7 ou 8 anos desde que eu usei, os docs up-to-date não parecem indicar esse recurso foi adicionado).

Uma possibilidade seria transferir outro arquivo que continha o tamanho descompactado (por exemplo, transferir tanto file.zip e file.zip.size) mas que parece cheia de perigos, especialmente se você obter o errado tamanho.

Outra alternativa é, se a descompactação servidor é tempo caro, mas não tem que ser feito imediatamente, para fazê-lo em uma tarefa em segundo plano de baixa prioridade (como com nice sob Linux). Mas, novamente, pode haver desvantagens se o verificador de tamanho começa a correr atrás de (muitos uploads chegando).

E eu tendem a pensar de descompressão em termos de "descompressão explosiva", não é um termo bom para uso: -)

Se você estiver fazendo o upload usando o formato raw 'compressa', então você não terá informações sobre o tamanho dos dados que estão sendo enviados. Pax é correta a este respeito.
Você pode armazená-lo como um cabeçalho de 4 bytes no início do buffer de compressão -. Assumindo que o tamanho do arquivo não exceda 4GB
algum código C como um exemplo:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

Depois de enviar o completo compressBuffer do tamanho compressedSize + sizeof (uLongf). Quando você recebê-lo no lado do servidor, você pode usar o seguinte código para obter a volta de dados:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

Se você não confiar no cliente para enviar o tamanho correto, então você vai precisar para realizar algum tipo de verificação de dados não comprimido no tamanho do servidor. A sugestão de usar descompactar para / dev / null é razoável.
Se você estiver fazendo o upload de um arquivo .zip, ele contém um diretório que informa o tamanho do arquivo quando ele é descompactado. Esta informação é construído no formato de arquivo, novamente, embora este está sujeito a clientes maliciosos.

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