From 4873117ec6aeb86ef169cbf8750123ca24041cdf Mon Sep 17 00:00:00 2001 From: polo Date: Mon, 28 Mar 2022 03:45:38 +0200 Subject: upload gros zip AJAX --- controller/backup.php | 145 +++++++++++++++++++++++++++++--------------- controller/installation.php | 12 +++- 2 files changed, 108 insertions(+), 49 deletions(-) (limited to 'controller') diff --git a/controller/backup.php b/controller/backup.php index 31974d0..b1a2491 100644 --- a/controller/backup.php +++ b/controller/backup.php @@ -2,7 +2,7 @@ // controller/backup.php // note: faire que cette fonction soit exécutée automatiquement de temps en temps -function sauvegarder($from) +function pageSauvegarde($from) { $title = 'extraction des données'; @@ -21,7 +21,7 @@ function sauvegarder($from) require('view/backup.php'); } -function creerMelainePHP() +function createZipMelainePHP() { $cheminDestination = 'data/'; $nomFichier = "melainePHP"; @@ -99,75 +99,124 @@ function createZip($destinationPath, $zipFileName, array $targetDirectories, arr } -function restaurer($from) +function restoreData($path) { - $title = 'Restauration des données'; - $message = ''; global $archiveFormat; + $message = ''; - // recharger la même page en écrivant les données - if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0) + // détecter le format (zip ou autre) + if($archiveFormat == 'zip') { - // détecter le format (zip ou autre) - if($archiveFormat == 'zip') + // extraction + try { - // une copie du zip est conservée dans data/ au cas où - move_uploaded_file($_FILES['archive']['tmp_name'], 'data/' . $_FILES['archive']['name']); - chmod('data/' . $_FILES['archive']['name'], 0666); - - $nomFichier = 'data/' . $_FILES['archive']['name']; - - // extraction - try - { - $Zip = new ZipArchive(); - } - catch (Throwable $e) // l'extension zip n'est pas activée - { - echo($e); - die(); - } - if($Zip->open($nomFichier, ZipArchive::RDONLY) === TRUE) + $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++) { - $j = 0; - for($i = 0; $i < $Zip->numFiles; $i++) + $nomEntree = $Zip->getNameIndex($i); + if($Zip->extractTo('.', $nomEntree) === TRUE) { - $nomEntree = $Zip->getNameIndex($i); - if($Zip->extractTo('.', $nomEntree) === TRUE) - { - $j++; - } - else - { - $message = '

Erreur: extraction du zip impossible.

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

Restauration réussie !!

'; + $message = '

Erreur: extraction du zip impossible.

'; } - $Zip->close(); + chmod($nomEntree, 0666); } - else + + if($j == $Zip->numFiles) { - // mauvais fichier - $message = '

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

'; + $message = '

Restauration réussie !!

'; } + $Zip->close(); } else { - // pas de module zip - $message = '

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

'; + // 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 = ''; + global $maxWeight; + + // recharger la même page en écrivant les données + if(isset($_SESSION['fileName']) && isset($_SESSION['fileSize']) && $_SESSION['fileSize'] > $maxWeight) + { + // 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 obtenues en AJAX + 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 dans file_upload.js +function uploadChunkAndMerge() +{ + // $_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); + } +} \ No newline at end of file diff --git a/controller/installation.php b/controller/installation.php index 4966611..3b940c8 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -138,13 +138,23 @@ function installation() { createIndexPHP('data/discographie/images-mini/index.php', $droitsFichiers); } + // fichiers temporaires pour upload des grosses archives + if(!file_exists('data/tmp')) + { + mkdir('data/tmp'); + chmod('data/tmp', $droitsDossiers); + } + if(!file_exists('data/tmp/index.php')) + { + createIndexPHP('data/tmp/index.php', $droitsFichiers); + } // le modèle donnera les droits 0666 (octal) aux nouveaux fichiers à l'intérieur des dossiers // créer le melainePHP.zip if(!file_exists("data/melainePHP.zip")) { require('controller/backup.php'); - creerMelainePHP(); + createZipMelainePHP(); } // création d'un mot de passe si password.txt est vide -- cgit v1.2.3