Come estrarre file zip

  • Creatore Discussione Creatore Discussione migo80
  • Data di inizio Data di inizio

migo80

Utente Attivo
25 Apr 2013
243
3
18
Salve a tutti come da titolo avrei bisogno di uno script per estrarre il contenuto di un file zip in diverse cartelle del sito.
In pratica sto realizzando un piccolo cms e vorrei gestire la procedura di upgrade dello stesso tramite file zippati come avviene con i vari joomla ed ecc...
Qualcuno può aiutarmi?
 
Grazie per la risposta, quello che vorrei sapere è se sia possibile indicare allo script in quali cartelle scompattare i file ad esempio:
mio_archiovio.zip dentro ci sono,
file_1.php deve essere scompattato nella cartella_1;
file_2 e file_3 nella cartella_2 ecc..
e le cartelle già sono presenti sul server.
Si può fare?
 
ciao
non ho mai usato il metodo per estrarre i file zip, ma da quello che mi sembra di capire i file vengono estratti tutti in una cartella unica, chiamamola cartella_temporanea
PHP:
<?php
//...
$archivia->extractTo('./cartella_temporanea/');
//...
?>
quindi in cartella-temporanea ti ritovi file_1.php, file_2.php ecc...
secondo me ora i casi sono due
1) il nome dei file richiamano in qualche modo il nome della cartella, es file_1.php in cartella_1, file_2.php in cartella_2 ecc..
allara è possibile spostare i vari file in automatico da cartella_temporanea alla propria
2) i nomi di file sono casuali allora devi fare tutto manina manina
nel caso 1) potresti procedere in questo modo
PHP:
<?php
//estrai i file nella cartella temporanea
$archivia = new ZipArchive();
$nome_file = "archivio2.zip";
if ($archivia->open($nome_file)!==TRUE) 
{
	echo"Impossibile aprire <$nome_file><br>";
	//e rimandi dove vuoi
}else{
	//scompatto i file nella cartella_temporanea
	$archivia->extractTo("./cartella-temporanea/");//da verificare i vari percorsi
	//leggi i nomi dei file scompattati in cartella-temporanea
	$files=glob("./cartella_temporanea/*.php");
	//ciclo quanto trovato
	foreach($files as $file){
		//prendo solo il nome, cioè tolgo il percorso
		$nome=basename($file);
		//poi questa parte dipende da come sono chiamati i file e le cartelle di destinazione
		//parto dal fatto che si chiamino file_2.php, file_2.php....
		//isolo la parte che mi servirà per determinare la cartella di arrivo
		$uno = strtr($nome, ".php", "");//tolgo l'estenzione
		$due=explode("_",$uno);//cerco il numero 1,2 ....$due[0] ->file, $due[1] -> 1...
		$cartella_destinazione=".../cartella_".$due[1];
		if(rename($file, $cartella_destinazione."/".$nome)){
			echo "il file $nome è stato caricato nella cartella $cartella_destinazione<br>";
		}else{
			echo "spostamento di $nome in $cartella_destinazione non risuscito<br>";
		}
	}
}
//.....
?>
però verifica se funziona, l'ho buttato giù di getto, nonostante il caldo becco
se funziona comunque devi adattarlo alle tue esigenze (percorsi e nome dei file)
 
Ultima modifica:
Grazie borgo gentilissimo ed utilissimo come sempre....lo script lo testerò più tardi e ti farò sapere.
Un ultima cosa ho notato che joomla utilizza un file xml per indicare dove estrarre i file da scompattare è così o mi sto sbagliando?
P.s. con questo caldo mi si sta fondendo la ventola del portatile :D
 
Scusami ancora ma nello script che mi hai suggerito non va la parte dello spostamento dei file dalla cartella temp a quella finale.
Questi sono gli errori:

( ! ) Warning: rename(./temp/file_2.php,.../file_2 /file_2.php): Impossibile trovare il percorso specificato. (code: 3) in C:\wampp\www\test_html\zip.php on line 24
Call Stack
# Time Memory Function Location
1 0.0010 245376 {main}( ) ..\zip.php:0
2 0.0040 247872 rename ( ) ..\zip.php:24
spostamento di file_2.php in .../file_2 non risuscito

( ! ) Warning: rename(./temp/files_2.php,.../file_2 /files_2.php): Impossibile trovare il percorso specificato. (code: 3) in C:\wampp\www\test_html\zip.php on line 24
Call Stack
# Time Memory Function Location
1 0.0010 245376 {main}( ) ..\zip.php:0
2 0.0060 248688 rename ( ) ..\zip.php:24
spostamento di files_2.php in .../file_2 non risuscito
 
questo è l'albero:
--catrella principale --all'interno c'è:
script.php
file_(cartella)
file.zip
temp(cartella)
 
Ho risolto sostituendo la funzione
PHP:
strtr($nome, ".php", "")
con la funzione
PHP:
 str_replace(".php","",$nome.".php");
perchè con la prima mi lasciava uno spazio dopo il nome del file dandomi l'errore del percorso sbagliato come si vede quì in rosso
" ( ! ) Warning: rename(./temp/files_2.php,.../file_2 /files_2.php): "
 
Ultima modifica:
Diciamo che ho raggiunto quello che volevo e cioé in un file xml indicare le cartelle e i file in esse contenute e farle leggere allo script php per scompattare il file zip e mettere i vari file contenuti nello zip nelle giuste cartelle.
P.s se qualcuno può perfezionarlo è ben accetto:
file xml:

Codice:
<?xml version="1.0" encoding="utf-8"?>
<dir_path>
  <dir id="001">
    <dir_des>yuri_2</dir_des>
	<file_name>file_3.php</file_name>
  </dir>
    <dir id="002">
    <dir_des>yuri_3</dir_des>
	<file_name>file_2.php</file_name>
  </dir>
    <dir id="003">
    <dir_des>yuri_3</dir_des>
	<file_name>files_2.php</file_name>
  </dir>

</dir_path>

script php:
PHP:
<?php
$xml=simplexml_load_file("step.xml") or die("Error: Cannot create object");
?>
<?php
//estrai i file nella cartella temporanea
$archivia = new ZipArchive();
$nome_file = "file.zip";
if ($archivia->open($nome_file)!==TRUE) 
{
    echo"Impossibile aprire <$nome_file><br>";
    //e rimandi dove vuoi
}else{
    //scompatto i file nella cartella_temporanea
    $archivia->extractTo("./temp/");
		foreach($xml->children() as $diret) { //eseguo il ciclo foreach per scorrere i vari nomi di cartelle e file

		if(!is_dir($diret->dir_des)){ //controllo se la cartella è già presente con is_dir...
			mkdir($diret->dir_des); // se non è presente la creo con la funzione mkdir...
		}        
	    $dest=$diret->dir_des.'/'; //variabile della cartella di destinazione
        if(rename("temp/".$diret->file_name,$dest.$diret->file_name)){ 
            echo "il file $diret->file_name è stato caricato nella cartella $dest<br>";
        }else{
            echo "spostamento di $diret->file_name in $dest non risuscito<br>";
        }
    }
  }//fine foreach xml
?>
 

Discussioni simili