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,
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
.
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";
}
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).
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';
}
?>
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>
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');
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?
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';
}
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>
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';
}
?>
Il suffit de changer
system('unzip $master.Zip');
À celui-ci
system('unzip ' . $master . '.Zip');
ou celui-ci
system("unzip {$master}.Zip");