open($destinationPath . $zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) { exit("Impossible de créer ou d'ouvrir ou créer le fichier data/" . $zipFileName . ".
Il est possible que ce fichier existe déjà et soit interdit en écriture.

Retour au site

"); } $compteur = 0; // recherche récursive dans les dossiers dans $directories foreach($targetDirectories as $path) { // les deux lignes suivantes permettent de le faire // c'est comme utiliser le paramètre "-r" dans la console $directory = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($directory); foreach ($iterator as $info) { // chemins inutiles . et .. if($info->getFilename() != "." && $info->getFilename() != "..") { $Zip->addGlob($info->getPathname(), 0, array('')); $compteur++; } } } // recherche à la racine avec des pattern de noms de fichiers // possibilité d'un tableau vide (paramètre optionnel) foreach($allPattern as $onePattern) { $Zip->addGlob($onePattern, 0, array('')); } $Zip->close(); if($compteur > 0) { chmod($destinationPath . $zipFileName, 0666); // en octal } else { $_SESSION['erreur'] = "Extraction des données impossible, le site entier est vide."; } } function restoreData($path) { global $archiveFormat; $message = ''; // détecter le format (zip ou autre) if($archiveFormat == 'zip') { // extraction try { $Zip = new ZipArchive(); } catch (Throwable $e) // l'extension zip n'est pas activée { echo($e); die(); } if($Zip->open($path, ZipArchive::RDONLY) === TRUE) { $j = 0; for($i = 0; $i < $Zip->numFiles; $i++) { $nomEntree = $Zip->getNameIndex($i); if($Zip->extractTo('.', $nomEntree) === TRUE) { $j++; } else { $message = '

Erreur: extraction du zip impossible.

'; } chmod($nomEntree, 0666); } if($j == $Zip->numFiles) { $message = '

Restauration réussie !!

'; } $Zip->close(); } else { // mauvais fichier $message = '

Erreur: Impossible d\'ouvrir l\'archive Zip."

'; } } else { // pas de module zip $message = '

Erreur: Veuillez activer l\'extension zip dans le php.ini pour pouvoir gérer les sauvegardes.

'; } return($message); } function pageRestauration($from) { $title = 'Restauration des données'; $message = ''; // taille max des fichiers dans le php.ini (défaut = 2M) global $maxWeight; // recharger la même page en écrivant les données if(isset($_SESSION['fileName']) && isset($_SESSION['fileSize']) && $_SESSION['fileSize'] > $maxWeight && file_exists('data/tmp/' . $_SESSION['fileName'])) { // une copie du zip est conservée dans data/ au cas où $path = 'data/' . $_SESSION['fileName']; rename('data/tmp/' . $_SESSION['fileName'], $path); chmod($path, 0666); // enregistrement $message = restoreData($path); } // variables crées dans ajax.php if(isset($_SESSION['fileName'])) { unset($_SESSION['fileName']); } if(isset($_SESSION['fileSize'])) { unset($_SESSION['fileSize']); } if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0) { // une copie du zip est conservée dans data/ au cas où $path = 'data/' . $_FILES['archive']['name']; move_uploaded_file($_FILES['archive']['tmp_name'], $path); chmod($path, 0666); // enregistrement $message = restoreData($path); } elseif(isset($_FILES['archive']) && $_FILES['archive']['error'] != 0) { $message = '

Erreur: Le fichier n\'a pas pu être téléchargé correctement.
Au fait, "upload_max_filesize" dans le php.ini vaut ' . ini_get('upload_max_filesize') . '.

'; } require('view/backup.php'); } // upload AJAX d'un zip en morceaux dans file_upload.js function uploadChunkAndMerge() // appel dans ajax.php { // $_GET['chunk_name'] n'est pas utilisé pour l'instant if(isset($_SESSION['fileName'])) { $zipName = 'data/tmp/' . $_SESSION['fileName']; $srcFile = fopen($_FILES['blob']['tmp_name'], 'r'); $destFile = fopen($zipName, 'a'); // 'a' crée ou écrit à la fin // copie de données brutes stream_copy_to_stream($srcFile, $destFile); fclose($srcFile); fclose($destFile); } }