Este blog é um complemento do nosso canal no YouTube. Clique em @CanalQb para seguir e acompanhar nossos vídeos!

Sugestões de pesquisas

Compactar Pastas com PHP, JavaScript e Ajax

#php; #javascript; #ajax
@CanalQb

PHP + Ajax com JavaScript: Como compactar pastas

@CanalQb

Aviso de Segurança

Sempre crie uma frase de segurança única para jogos, Airdrops e qualquer outra coisa de origem desconhecida, em vez de usar sua carteira principal.

Importante

Nunca use este tipo de técnica para acessar pastas sensíveis de outros usuários, como a da MetaMask em \AppData\Local\Google\Chrome\User Data. Este conteúdo é educativo!

Entendendo o processo

Não é possível zipar uma pasta diretamente no navegador sem uma solução que envolva JavaScript e alguma linguagem no servidor como PHP. Para isso, utilizamos uma abordagem com jQuery e Ajax, além de um script em PHP no back-end.

1. Adicione o jQuery à sua página

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

2. Crie o formulário HTML

Este formulário permite que o usuário selecione uma pasta usando o atributo webkitdirectory:

<form id="zip-form">
  <label for="folder-input">Selecione uma pasta para zipar:</label>
  <input type="file" id="folder-input" webkitdirectory directory multiple />
  <button type="submit">Zipar</button>
</form>

3. Script jQuery para envio via AJAX

$('#zip-form').submit(function(e) {
  e.preventDefault();
  var formData = new FormData(this);

  $.ajax({
    url: 'zip-folder.php',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    success: function() {
      alert('Pasta zipada com sucesso!');
    },
    error: function(xhr, status, error) {
      alert('Erro ao zipar a pasta: ' + error);
    }
  });
});

4. Script PHP para zipar a pasta

O arquivo PHP será responsável por receber os arquivos e criar o arquivo .zip para download:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES)) {
  $zip = new ZipArchive();
  $zipFileName = 'folder.zip';

  if ($zip->open($zipFileName, ZipArchive::CREATE) !== TRUE) {
    exit('Não foi possível criar o arquivo zip.');
  }

  $files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($_FILES['folder-input']['tmp_name'])
  );

  foreach ($files as $file) {
    if (!$file->isDir()) {
      $filePath = $file->getRealPath();
      $relativePath = substr($filePath, strlen($_FILES['folder-input']['tmp_name']) + 1);
      $zip->addFile($filePath, $relativePath);
    }
  }

  $zip->close();

  header('Content-Type: application/zip');
  header('Content-Disposition: attachment; filename=' . $zipFileName);
  header('Content-Length: ' . filesize($zipFileName));
  readfile($zipFileName);
  unlink($zipFileName);
}
?>

Considerações Finais

Esse conjunto de código é ideal para aplicações web onde seja necessário permitir ao usuário compactar arquivos antes de enviar ou armazenar. Ele pode ser adaptado para diversas finalidades, como backup de uploads, envio de múltiplos arquivos em uma só requisição ou organização interna de dados.

Para mais informações, consulte a documentação oficial do ZipArchive do PHP.

Postar um comentário

Comente só assim vamos crescer juntos!
CanalQb mais próximo Quer falar com o CanalQb?
Em que posso te ajudar?
Fale comigo