Come estrarre file zip

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?
 

migo80

Utente Attivo
25 Apr 2013
243
3
18
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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:

migo80

Utente Attivo
25 Apr 2013
243
3
18
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
 

migo80

Utente Attivo
25 Apr 2013
243
3
18
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
 

migo80

Utente Attivo
25 Apr 2013
243
3
18
questo è l'albero:
--catrella principale --all'interno c'è:
script.php
file_(cartella)
file.zip
temp(cartella)
 

migo80

Utente Attivo
25 Apr 2013
243
3
18
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:

migo80

Utente Attivo
25 Apr 2013
243
3
18
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
Autore Titolo Forum Risposte Data
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
J estrarre url dei file video da youtube "get_video_info" PHP 6
I estrarre solo la p.iva e il range di pagine relativo da un file txt C/C++ 0
I Estrarre dati da un file php PHP 3
D Estrarre testo da file xml PHP 2
M Script per estrarre testo da file .doc e . pdf ASP.NET 1
S estrarre file da un punto iso Windows e Software 0
G Estrarre file da un *.exe Programmazione 5
M Estrarre soltanto i prodotti con stessa descrizione PHP 10
peppe0703 Come Estrarre dati da db wordpress e richiamarli in html esterno HTML e CSS 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
E Estrarre dati da doppia tabella, banale ma non sempre PHP 1
M Estrarre valore con SELECT COUNT PHP 0
D Estrarre database con link esterno Database 10
S Raggruppare ed estrarre data più recente MySQL 6
F Estrarre ultima foto da cartelle PHP 2
R Estrarre valori duplicati più volte PHP 0
C Estrarre dati stringa Sql Database 1
L estrarre valori max tra più tabelle MySQL 2
L Estrarre da Cartella una determinata 'via' PHP 15
M Estrarre dati da un database PHP 2
M Estrarre valori MAX da un db con una left join MySQL 8
M Estrarre dati da una select HTML PHP 3
C [PHP] Estrarre da una classe i valori che mi interessano PHP 5
S [PHP] Estrarre dati da tabella e fare la media ad intervalli di tempo PHP 11
R [PHP] Estrarre id utente loggato.? PHP 4
S [PHP] Estrarre elementi array su più variabili PHP 5
S [PHP] Estrarre dati tabella in diversi array PHP 2
P [MS ACCESS] Estrarre più somme da una query MS Access 4
trattorino estrarre titolo video facebook in php PHP 0
D [WordPress] come fare per estrarre dati da un db MySQL tramite una form e visualizzare il risultato WordPress 0
S [Javascript] come estrarre valori array e inserirli in diverse variabili Javascript 1
N [PHP] Estrarre singolo valore da array PHP 4
trattorino [PHP] sql estrarre in base all'ultima visita PHP 4
P [Visual Basic] access sql estrarre id vendite x cli e articolo con data maggiore del recordset Visual Basic 2
Jensen [PHP] Estrarre prossimi 4 lunedì PHP 4
trattorino [PHP] estrarre dati singoli PHP 1
G [PHP] estrarre data da timeline yyyy-dd-gg hh:mm:ss PHP 4
Z Estrarre dati da un DB Mysql PHP 4
I database mysql estrarre due tabelle Database 2
S [PHP] Estrarre dati colonna in una stringa PHP 6
S [PHP] estrarre dati sito web protetto con username e password PHP 13
Merlina3377 [PHP] estrarre solo un determinato id da tanti con REGEXP O LIKE PHP 1
Gigi87 estrarre i dati da un forum o social network Presentati al Forum 1
trattorino Estrarre Nome Utente jquery div php PHP 9
trattorino [Javascript] estrarre id link yt Javascript 1
S [PHP] estrarre le email da un elenco di url PHP 21
T4MAR4 [PHP] estrarre tag da un testo PHP 3
T [PHP] Estrarre stringa PHP 3
G [PHP] ESTRARRE DA DB VALORE MASSIMO E MINIMO IN UN INTERVALLO IMPOSTABILE A PIACERE PHP 56

Discussioni simili