web-dev-qa-db-fra.com

Décompressez un fichier avec php

Je veux décompresser un fichier et cela fonctionne bien

system('unzip File.Zip');

Mais je dois passer le nom du fichier via l'URL et je ne peux pas le faire fonctionner, c'est ce que j'ai.

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

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

Merci,

183
BostonBB

Je ne peux que supposer que votre code provient d'un didacticiel quelque part en ligne? Dans ce cas, bon travail en essayant de le résoudre vous-même. D'autre part, le fait que ce code puisse réellement être publié en ligne quelque part comme moyen correct 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 les appels system pour 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!';
}

En outre, comme d'autres l'ont commenté, $HTTP_GET_VARS est obsolète depuis la version 4.1 ... ce qui était très récent. Ne l'utilisez pas. Utilisez plutôt le $_GET superglobal.

Enfin, faites très attention à ne pas accepter les entrées transmises à un script via une variable $_GET.

TOUJOURS NETTOYER L'ENTREE UTILISATEUR.


UPDATE

Selon votre commentaire, le meilleur moyen d'extraire le fichier Zip dans le même répertoire que celui dans lequel il réside consiste à déterminer le chemin d'accès difficile au fichier et à l'extraire spécifiquement à cet emplacement. Donc, vous pourriez 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";
}
463
rdlowrey

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.

Donc, 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).

35
Aleksandar Vucetic

Utiliser getcwd() pour 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';
}
?>
7
Rubyx

J'ai mis à jour la réponse de @ rdlowrey en un code plus propre et meilleur. Cela décompressera un fichier dans le répertoire actuel à l'aide de __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> 
5
Morteza Ziyae

Essayez simplement ceci yourDestinationDir est la destination à extraire ou à supprimer - d yourDestinationDir à extraire vers le répertoire racine.

$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.Zip');
4
Samuel Kwame Antwi

PHP a sa propre classe intégrée qui peut être utilisée pour décompresser ou extraire le contenu d'un fichier Zip. La classe est ZipArchive. Ci-dessous, le code simple et basique PHP qui extraira un fichier Zip et le placera dans un répertoire spécifique:

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

Si vous voulez des fonctionnalités avancées, voici le code amélioré qui vérifiera si le fichier Zip existe ou non:

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

Source: Comment décompresser ou extraire des fichiers Zip en PHP?

1

vous pouvez utiliser la fonction préemballée

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

Comment l'utiliser.

if(unzip_file($file["name"],'uploads/')){
echo 'Zip archive extracted successfully';
}else{
  echo 'Zip archive extraction failed';
}
0
user889030

J'ai mis à jour la réponse de Morteza Ziaeemehr à un code plus propre et de meilleure qualité, cela décompressera un fichier fourni dans le formulaire dans le répertoire courant à l'aide de 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
Varun Naharia

Utilisez ci-dessous le code PHP, avec le nom du fichier dans le paramètre d'URL "nom"

<?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
huync

Il suffit de changer

system('unzip $master.Zip');

À celui-ci

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

ou celui-ci

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

0
user3225732