
PHP + Ajax com JavaScript: Como compactar pastas

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.