Como compactar e descompactar arquivos em PHP

A compactação de arquivos ao transferi-los pela Internet tem muitas vantagens. Na maioria dos casos, o tamanho total combinado de todos os arquivos no formato compactado é reduzido por uma boa margem. Isso significa que você economizará parte da sua largura de banda e os usuários também obterão velocidades de download mais rápidas. Depois que os usuários baixam um arquivo, eles podem descompactá-lo sempre que quiserem. Em suma, a compactação pode facilitar muito a veiculação de arquivos pela Internet para você e seus visitantes.

Um fator que pode desencorajá-lo a compactar arquivos ou tornar o processo muito cansativo é o fato de você estar fazendo isso manualmente. Felizmente, o PHP vem com muitas extensões que lidam especificamente com compactação e extração de arquivos. Você pode usar as funções disponíveis nessas extensões para compactar arquivos automaticamente em PHP.

Este tutorial ensinará como compactar e descompactar (compactar e extrair) arquivos de e para um arquivo zip em PHP. Você também aprenderá como excluir ou renomear arquivos em um arquivo sem extraí-los primeiro.

Compactando arquivos em PHP

O PHP ZipArchive class tem muitas propriedades e métodos que podem ajudá-lo a compactar e descompactar todos os seus arquivos.

Compactar arquivos individuais

Você pode adicionar arquivos ao seu arquivo zip um de cada vez ou adicionar todo o diretório de uma vez. Em ambos os casos, o primeiro passo é criar um novo ZipArchive instância e, em seguida, chamando o open($filename, [$flags]) método. Este método abrirá um novo arquivo zip para leitura, escrita ou outras modificações. Existem quatro valores válidos para o opcional $flag parâmetro que determinam como lidar com diferentes situações.

  • ZipArchive::OVERWRITE—Este sinalizador substituirá o conteúdo do arquivo especificado se ele já existir.
  • ZipArchive::CREATE—Este sinalizador criará um novo arquivo se ainda não existir.
  • ZipArchive::EXCL—Este sinalizador resultará em um erro se o arquivo já existir.
  • ZipArchive::CHECKCONS—Este sinalizador dirá ao PHP para realizar verificações de consistência adicionais no arquivo e apresentará um erro se falhar.

Você pode verificar a documentação deste método para conhecer os diferentes códigos de erro retornados em caso de falhas ao abrir o arquivo. Se o arquivo zip foi aberto ou criado com sucesso, o método retornará true.

Depois de abrir o arquivo com sucesso, você pode usar o addFile($filename, $localname, $start, $length) método para adicionar qualquer arquivo de um determinado caminho ao seu arquivo. o $filename parâmetro é o caminho de um arquivo que você deseja adicionar ao arquivo. o $localname parâmetro é usado para atribuir um nome ao arquivo para armazená-lo dentro do arquivo. Você pode ligar addFile() sempre que você quiser adicionar um novo arquivo ao seu arquivo.

Depois de adicionar todos os arquivos necessários ao arquivo, você pode simplesmente chamar o close() para fechá-lo e salvar as alterações.

Digamos que você tenha um site que permite aos usuários baixar arquivos de fontes para diferentes fontes junto com as informações de licenciamento para usá-los. Arquivos como esses serão exemplos perfeitos de arquivamento automatizado usando PHP. O código a seguir mostra como fazer exatamente isso.

Começamos criando um ZipArchive instância e, em seguida, usando o open() método para criar nosso arquivo. o addFile() método adiciona nosso real .ttf arquivo de fonte e o .TXT arquivo de licença para o arquivo.

Você deve observar que os arquivos originais estavam dentro do fontes/Monoton diretório. No entanto, o código PHP o coloca diretamente na raiz do nosso arquivo. Você pode alterar a estrutura de diretórios, bem como os nomes dos arquivos que vão para o arquivo.

Compactando vários arquivos de um diretório

Adicionar arquivos individuais ao seu arquivo pode ficar cansativo depois de um tempo. Por exemplo, você pode querer criar um arquivo de todos os .pdf ou .png arquivos em um diretório. o addGlob($pattern, $flags, $options) será muito útil neste caso. A única desvantagem desse método é que você perde o controle sobre a localização de arquivos individuais no arquivo morto. No entanto, você ainda pode influenciar a estrutura de diretórios dentro do arquivo usando o $options parâmetro. As opções são passadas na forma de um array associativo.

  • add_path—O valor que você atribui a add_path é prefixado para o caminho local do arquivo dentro do arquivo.
  • remove_path—O valor que você atribui a remove_path é usado para remover um prefixo correspondente do caminho de diferentes arquivos que são adicionados ao arquivo.
  • remove_all_path—Definindo o valor de remove_all_path para true irá remover tudo do caminho do arquivo além de seu nome. Nesse caso, os arquivos são adicionados à raiz do arquivo.

É importante lembrar que a remoção de um caminho é feita antes de prefixar o valor especificado em add_path.

O trecho de código a seguir fará o uso de addGlob() e todas essas opções mais claras.

Como de costume, começamos criando um ZipArchive instância e, em seguida, use o open() método para criar nosso arquivo. Também especificamos valores diferentes para o add_path chave no $options array cada vez antes de chamar o addGlob() método. Dessa forma, podemos lidar com um conjunto específico de arquivos por vez e fornecer opções de arquivamento de acordo.

No primeiro caso, iteramos sobre todos .jpg arquivos no luzes diretório e colocá-los no light_wallpapers diretório no arquivo. Da mesma forma, iteramos sobre todos os .ttf arquivos no documentos diretório e, em seguida, colocá-los dentro de uma pasta chamada font_files em nosso arquivo. Por fim, iteramos sobre todos os .jpg e .png arquivos em nossos documentos de uma só vez e colocá-los todos juntos no imagens diretório.

Como você pode ver, os valores $options parâmetro são úteis na organização do conteúdo dentro do arquivo.

Extraindo conteúdo de um arquivo

o ZipArchive classe tem um método chamado extractTo($destination, $entries) para extrair o conteúdo de um arquivo. Você pode usá-lo para extrair tudo dentro do arquivo ou apenas alguns arquivos específicos. o $entries O parâmetro pode ser usado para especificar um único nome de arquivo que deve ser extraído ou você pode usá-lo para passar uma matriz de arquivos.

Um ponto importante a ser lembrado é que você precisa especificar o caminho correto do arquivo dentro do arquivo para extraí-lo. Por exemplo, arquivamos um arquivo de fonte chamado AlegreyaSans-Light.ttf na seção anterior. O arquivo foi armazenado dentro do arquivo em um diretório chamado font_files. Isso significa que o caminho que você precisa especificar no $entries parâmetro seria font_files/AlegreyaSans-Light.ttf e não simplesmente AlegreyaSans-Light.ttf.

O diretório e a estrutura de arquivos serão preservados durante o processo de extração, e os arquivos serão extraídos em seus respectivos diretórios.

Se você omitir o segundo parâmetro, o método extrairá todos os arquivos do arquivo.

Obtenha mais controle sobre os arquivos

o ZipArchive class também tem muitos outros métodos e propriedades para ajudá-lo a obter mais informações sobre o arquivo antes de extrair todo o seu conteúdo.

Você pode contar o número de arquivos em um arquivo usando o count() método. Outra opção é usar o numFiles propriedade. Eles podem ser usados ​​para iterar sobre todos os arquivos do arquivo e extrair apenas os que você precisa – ou você pode fazer outra coisa com eles, como removê-los do arquivo.

No exemplo a seguir, estamos excluindo todos os arquivos do arquivo que contêm a palavra itálico. Código semelhante pode ser usado para excluir todos os arquivos que não contêm uma palavra específica. Você também pode iterar sobre esses arquivos e substituir uma palavra específica por outra.

No código acima, estamos usando deleteName() para excluir um arquivo individual. No entanto, você também pode usá-lo para excluir um diretório inteiro.

Uma função semelhante renameName($oldname, $newname) pode ser usado para alterar o nome de qualquer arquivo no arquivo. Você receberá um erro se um arquivo intitulado $newname já existe.

Pensamentos finais

Nós cobrimos um monte de métodos muito úteis do ZipArchive class que facilitará a compactação e extração automatizada de arquivos em PHP. Agora você deve ser capaz de compactar arquivos individuais ou um grupo deles de uma só vez, com base em seus próprios critérios. Da mesma forma, você deve conseguir extrair qualquer arquivo específico do arquivo sem afetar outro conteúdo.

Com a ajuda de count() e numFiles, você terá mais controle sobre os arquivos individuais e renomeá-los ou excluí-los seria super fácil. Você deve ler a documentação pelo menos uma vez para ler mais sobre essas funções.

Deixe um comentário

O seu endereço de e-mail não será publicado.