2012-01-17 15 views
144

voglio decomprimere un file e questo funziona benedecomprimere un file con PHP

system('unzip File.zip'); 

ma ho bisogno di passare nel nome del file tramite l'URL e non può farlo funzionare, questo è quello che ho .

$master = $_GET["master"]; 
system('unzip $master.zip'); 

Cosa mi manca? So che deve essere qualcosa di piccolo e stupido che sto trascurando.

Grazie,

+32

Le doppie virgolette valutano le variabili; le virgolette singole no. MA - fai attenzione, il semplice passaggio di qualche input a una chiamata di sistema potrebbe essere piuttosto pericoloso. – Wiseguy

+23

Devo dire che non mi piace il tono ostile di alcuni commenti. Se voi ragazzi comprendete che lei/lui è scomparso, allora ditelo/lui. Ci manca qualcosa a un certo punto. –

+0

L'errore qui è semplice. Stai tentando di utilizzare l'interpolazione delle stringhe con citazioni semplici invece di virgolette doppie.L'interpolazione delle stringhe non funziona con le virgolette semplici perché è usata per i valori letterali delle stringhe. Quindi, cambiando il tuo codice in 'system (" decomprimi $ master.zip ");' dovrebbe funzionare. –

risposta

367

Posso solo supporre che il tuo codice provenga da un tutorial da qualche parte online? In tal caso, buon lavoro cercando di capirlo da solo. D'altra parte, il fatto che questo codice possa effettivamente essere pubblicato online da qualche parte come il modo corretto per decomprimere un file è un po 'spaventoso.

PHP ha estensioni incorporate per la gestione di file compressi. Non dovrebbe essere necessario utilizzare le chiamate system per questo. ZipArchivedocs è un'opzione.

$zip = new ZipArchive; 
$res = $zip->open('file.zip'); 
if ($res === TRUE) { 
    $zip->extractTo('/myzips/extract_path/'); 
    $zip->close(); 
    echo 'woot!'; 
} else { 
    echo 'doh!'; 
} 

Inoltre, come altri hanno già detto, $HTTP_GET_VARS è stato deprecato dalla versione 4.1 ... che era un reeeeeally molto tempo fa. Non usarlo Utilizzare invece il superglobale $_GET.

Infine, prestare molta attenzione all'accettazione di qualsiasi input passato a uno script tramite una variabile $_GET.

SANIFICARE SEMPRE L'INGRESSO UTENTE.


UPDATE

Come per il commento, il modo migliore per estrarre il file zip nella stessa directory in cui si trova è quello di determinare il percorso difficile il file ed estrarlo in particolare a quella Posizione. Quindi, si potrebbe fare: risposta

// assuming file.zip is in the same directory as the executing script. 
$file = 'file.zip'; 

// get the absolute path to $file 
$path = pathinfo(realpath($file), PATHINFO_DIRNAME); 

$zip = new ZipArchive; 
$res = $zip->open($file); 
if ($res === TRUE) { 
    // extract it to the path we determined above 
    $zip->extractTo($path); 
    $zip->close(); 
    echo "WOOT! $file extracted to $path"; 
} else { 
    echo "Doh! I couldn't open $file"; 
} 
+0

Grazie per il consiglio. Sono nuovo di questo e sto solo cercando di capire tutto. Con il tuo codice, come posso farlo decomprimere nella stessa cartella in cui si trova il file zippato? – BostonBB

+2

Bene, c'è una differenza tra la directory di lavoro corrente del tuo script e la directory in cui risiede il file zip. Se il file zip si trova nella stessa directory dello script, si può fare '$ zip-> extractTo ('./');' Tuttavia, questo probabilmente non è il caso. Un'opzione migliore è determinare la posizione del file zip nel filesystem ed estrarla lì. Aggiornerò la mia risposta per dimostrare. – rdlowrey

+0

Cosa succede se non hai la classe ZipArchive disponibile? Sto lavorando su un sito con crap hosting e ottengo l'errore 'Fatal error: Class 'ZipArchive' non trovato' che provo questo script :-(C'è qualche opzione a quel punto? – CWSpear

25

Ti prego, non farlo in quel modo (passando GET var di far parte di una chiamata di sistema). Utilizzare invece ZipArchive.

Quindi, il codice dovrebbe essere simile:

$zipArchive = new ZipArchive(); 
$result = $zipArchive->open($_GET["master"]); 
if ($result === TRUE) { 
    $zipArchive ->extractTo("my_dir"); 
    $zipArchive ->close(); 
    // Do something else on success 
} else { 
    // Do something on error 
} 

E per rispondere alla tua domanda, il tuo errore è 'qualcosa di $ var qualcos'altro' dovrebbe essere "qualcosa di $ var qualcos'altro" (tra virgolette).

+3

+1 Oops, mi dispiace per virare praticamente la stessa risposta cinque minuti dopo. Non ti ho visto lì :) – rdlowrey

4

Ho aggiornato di @rdlowrey a un codice più pulito e meglio, questo verrà decomprimere un file in directory corrente utilizzando __DIR__.

<?php 
    // config 
    // ------------------------------- 
    // only file name + .zip 
    $zip_filename = "YOURFILENAME.zip"; 
?> 

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset='utf-8' > 
    <title>Unzip</title> 
    <style> 
     body{ 
      font-family: arial, sans-serif; 
      word-wrap: break-word; 
     } 
     .wrapper{ 
      padding:20px; 
      line-height: 1.5; 
      font-size: 1rem; 
     } 
     span{ 
      font-family: 'Consolas', 'courier new', monospace; 
      background: #eee; 
      padding:2px; 
     } 
    </style> 
</head> 
<body> 
    <div class="wrapper"> 
     <?php 
     echo "Unzipping <span>" .__DIR__. "/" .$zip_filename. "</span> to <span>" .__DIR__. "</span><br>"; 
     echo "current dir: <span>" . __DIR__ . "</span><br>"; 
     $zip = new ZipArchive; 
     $res = $zip->open(__DIR__ . '/' .$zip_filename); 
     if ($res === TRUE) { 
      $zip->extractTo(__DIR__); 
      $zip->close(); 
      echo '<p style="color:#00C324;">Extract was successful! Enjoy ;)</p><br>'; 
     } else { 
      echo '<p style="color:red;">Zip file not found!</p><br>'; 
     } 
     ?> 
     End Script. 
    </div> 
</body> 
</html> 
0

Basta cambiare

system('unzip $master.zip'); 

Per questo

system('unzip ' . $master . '.zip'); 

o questa

system("unzip {$master}.zip");

+6

Mentre questo potrebbe risolvere il problema che stava avendo, dare un'occhiata alle altre risposte per capire perché questo è un cattivo consiglio. – rjdown

-1

Basta usare questo:

$master = $_GET["master"]; 
    system('unzip' $master.'.zip'); 

nel codice $master è passato come una stringa, il sistema sarà alla ricerca di un file chiamato $master.zip

$master = $_GET["master"]; 
    system('unzip $master.zip'); `enter code here` 
+3

Solo completamente sbagliato. ''decomprimi' $ master' non funzionerebbe a meno che tu non aggiungessi uno spazio dopo aver decompresso e aggiunto un periodo dopo la citazione singola. Sarebbe stato molto più semplice suggerire 'system (" decomprimere $ master.zip ")' con virgolette doppie, o almeno una risposta valida. –

+0

È preferibile utilizzare le funzioni di sistema PHP piuttosto che affidarsi alle funzioni di sistema. –

4

semplicemente provare questa yourDestinationDir è la destinazione di estrarre o rimuovere -d yourDestinationDir per estrarre nella directory principale.

$master = 'someDir/zipFileName'; 
$data = system('unzip -d yourDestinationDir '.$master.'.zip'); 
+1

Ho usato 'yourDestinationDir' come' session_save_path(). DIRECTORY_SEPARATOR. "$ name". DIRECTORY_SEPARATOR' dove '$ nome' è la cartella di destinazione da decomprimere nella cartella di sessione. –

+0

Fai molta attenzione quando lavori con le funzioni di sistema o exec che contengono variabili! Può letteralmente fornire una linea di comando gratuita dal tuo server a un hacker. – maxime

+0

@maxime Com'è possibile? per favore spiega perché penso php come misura per impedire che ciò accada. Back your claims with facts –

0

ho risposta aggiornata di Morteza Ziaeemehr a un codice più pulito e meglio, questo verrà decomprimere un file fornito nel modulo nella directory corrente utilizzando DIR.

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset='utf-8' > 
    <title>Unzip</title> 
    <style> 
    body{ 
    font-family: arial, sans-serif; 
    word-wrap: break-word; 
    } 
    .wrapper{ 
    padding:20px; 
    line-height: 1.5; 
    font-size: 1rem; 
    } 
    span{ 
    font-family: 'Consolas', 'courier new', monospace; 
    background: #eee; 
    padding:2px; 
    } 
    </style> 
</head> 
<body> 
    <div class="wrapper"> 
    <?php 
    if(isset($_GET['page'])) 
    { 
     $type = $_GET['page']; 
     global $con; 
     switch($type) 
     { 
      case 'unzip': 
      {  
       $zip_filename =$_POST['filename']; 
       echo "Unzipping <span>" .__DIR__. "/" .$zip_filename. "</span> to <span>" .__DIR__. "</span><br>"; 
       echo "current dir: <span>" . __DIR__ . "</span><br>"; 
       $zip = new ZipArchive; 
       $res = $zip->open(__DIR__ . '/' .$zip_filename); 
       if ($res === TRUE) 
       { 
        $zip->extractTo(__DIR__); 
        $zip->close(); 
        echo '<p style="color:#00C324;">Extract was successful! Enjoy ;)</p><br>'; 
       } 
       else 
       { 
        echo '<p style="color:red;">Zip file not found!</p><br>'; 
       } 
       break; 
      } 
     } 
    } 
?> 
End Script. 
</div> 
    <form name="unzip" id="unzip" role="form"> 
     <div class="body bg-gray"> 
      <div class="form-group"> 
       <input type="text" name="filename" class="form-control" placeholder="File Name (with extension)"/> 
      </div>   
     </div> 
    </form> 

<script type="application/javascript"> 
$("#unzip").submit(function(event) { 
    event.preventDefault(); 
    var url = "function.php?page=unzip"; // the script where you handle the form input. 
    $.ajax({ 
    type: "POST", 
    url: url, 
    dataType:"json", 
      data: $("#unzip").serialize(), // serializes the form's elements. 
      success: function(data) 
      { 
       alert(data.msg); // show response from the php script. 
       document.getElementById("unzip").reset(); 
      } 

      }); 

    return false; // avoid to execute the actual submit of the form 
    }); 
</script> 
</body> 
</html> 
0

è possibile utilizzare la funzione preconfezionato

function unzip_file($file, $destination){ 
    // create object 
    $zip = new ZipArchive() ; 
    // open archive 
    if ($zip->open($file) !== TRUE) { 
     return false; 
    } 
    // extract contents to destination directory 
    $zip->extractTo($destination); 
    // close archive 
    $zip->close(); 
     return true; 
} 

Come usarlo.

if(unzip_file($file["name"],'uploads/')){ 
echo 'zip archive extracted successfully'; 
}else{ 
    echo 'zip archive extraction failed'; 
} 
0
function extract_zip($Sourse_file, $extract_folder){ 
    $zip = new ZipArchive() ; 
    if (!$zip->open($Sourse_file) == TRUE) { 
     return false; 
    } 
    $zip->extractTo($extract_folder); 
    $zip->close(); 
     return true; 
} 
+1

descrivi la tua risposta per favore – IsuruAb

0

Usa sotto il codice PHP, con il nome del file nell'URL param "nome"

<?php 

$fileName = $_GET['name']; 

if (isset($fileName)) { 


    $zip = new ZipArchive; 
    $res = $zip->open($fileName); 
    if ($res === TRUE) { 
     $zip->extractTo('./'); 
     $zip->close(); 
     echo 'Extracted file "'.$fileName.'"'; 
    } else { 
     echo 'Cannot find the file name "'.$fileName.'" (the file name should include extension (.zip, ...))'; 
    } 
} 
else { 
    echo 'Please set file name in the "name" param'; 
} 

?> 
0

PHP ha una propria classe integrato che può essere utilizzato per decomprimere o estrae il contenuto da una zip file. La classe è ZipArchive. Di seguito si riporta il codice semplice e di base PHP che estrarre un file zip e inserirlo in una directory specifica:

<?php 
$zip_obj = new ZipArchive; 
$zip_obj->open('dummy.zip'); 
$zip_obj->extractTo('directory_name/sub_dir'); 
?> 

Se si desidera che alcuni caratteristiche anticipo, allora qui di seguito è il miglioramento del codice che controlla se è presente il file zip o no:

<?php 
$zip_obj = new ZipArchive; 
if ($zip_obj->open('dummy.zip') === TRUE) { 
    $zip_obj->extractTo('directory/sub_dir'); 
    echo "Zip exists and successfully extracted"; 
} 
else { 
    echo "This zip file does not exists"; 
} 
?> 

Fonte: How to unzip or extract zip files in PHP?

0

Utilizzando getcwd() per estrarre nella stessa directory

<?php 
$unzip = new ZipArchive; 
$out = $unzip->open('wordpress.zip'); 
if ($out === TRUE) { 
    $unzip->extractTo(getcwd()); 
    $unzip->close(); 
    echo 'File unzipped'; 
} else { 
    echo 'Error'; 
} 
?>