186 votes

Dézipper un fichier avec php

Je veux dézipper un fichier et cela fonctionne bien.

system('unzip File.zip');

Mais j'ai besoin de passer le nom du fichier par l'URL et je n'arrive pas à le faire fonctionner, voici ce que j'ai.

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

Qu'est-ce que je rate ? Je sais que ça doit être quelque chose de petit et de stupide que je néglige.

Merci,

473voto

rdlowrey Points 15589

Je ne peux que supposer que votre code provient d'un tutoriel quelque part en ligne ? Dans ce cas, bon travail d'essayer de le comprendre par vous-même. D'un autre côté, le fait que ce code puisse être publié en ligne quelque part comme étant la manière correcte de décompresser un fichier est un peu effrayant.

PHP a des extensions intégrées pour traiter les fichiers compressés. Il ne devrait pas être nécessaire d'utiliser system appelle à cela. ZipArchive docs est une option.

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

De plus, comme d'autres l'ont fait remarquer, $HTTP_GET_VARS est déprécié depuis la version 4.1 ... qui date d'il y a très longtemps. Ne l'utilisez pas. Utilisez le $_GET superglobale à la place.

Enfin, soyez très prudent quant à l'acceptation de toute entrée transmise à un script via une balise $_GET variable.

TOUJOURS NETTOYER L'ENTRÉE DE L'UTILISATEUR.


UPDATE

Conformément à votre commentaire, la meilleure façon d'extraire le fichier zip dans le même répertoire que celui où il se trouve est de déterminer le chemin d'accès au fichier et de l'extraire spécifiquement à cet endroit. Donc, vous pourriez le faire :

// 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";
}

35voto

S'il vous plaît, ne le faites pas comme ça (passer GET var pour faire partie d'un appel système). Utilisez ZipArchive à la place.

Ainsi, votre code devrait ressembler à :

$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
}

Et pour répondre à votre question, votre erreur est 'quelque chose $var quelque chose d'autre' devrait être "quelque chose $var quelque chose d'autre" (entre guillemets).

11voto

Rubyx Points 390

Utilisation de getcwd() à extraire dans le même répertoire

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

5voto

Essayez simplement ceci votreDestinationDir est la destination vers laquelle extraire ou enlever -d votreDestinationDir pour extraire dans le répertoire racine.

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

5voto

Morteza Points 354

J'ai mis à jour la réponse de @rdlowrey pour obtenir un code plus propre et plus efficace, ce qui permettra de décompresser un fichier dans le répertoire courant en utilisant la fonction __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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X