Ich möchte eine Datei entpacken und das funktioniert einwandfrei
system('unzip File.Zip');
Aber ich muss den Dateinamen über die URL übergeben und kann es nicht zum Laufen bringen, das ist es, was ich habe.
$master = $_GET["master"];
system('unzip $master.Zip');
Was vermisse ich? Ich weiß, es muss etwas Kleines und Dummes sein, das ich übersehen habe.
Danke,
Ich kann nur davon ausgehen, dass Ihr Code aus einem Online-Tutorial stammt. In diesem Fall gute Arbeit, um es selbst herauszufinden. Auf der anderen Seite ist die Tatsache, dass dieser Code tatsächlich irgendwo online veröffentlicht werden könnte, da der richtige Weg zum Entpacken einer Datei ein bisschen beängstigend ist.
PHP hat eingebaute Erweiterungen für den Umgang mit komprimierten Dateien. Hierfür sollten keine system
Aufrufe erforderlich sein. ZipArchive
docs ist eine Option.
$Zip = new ZipArchive;
$res = $Zip->open('file.Zip');
if ($res === TRUE) {
$Zip->extractTo('/myzips/extract_path/');
$Zip->close();
echo 'woot!';
} else {
echo 'doh!';
}
Außerdem wurde $HTTP_GET_VARS
, Wie andere bereits kommentiert haben, seit Version 4.1 ..., die vor langer Zeit reeeeeally war, als veraltet eingestuft. Benutze es nicht. Verwenden Sie stattdessen den Superglobalen $_GET
.
Seien Sie außerdem sehr vorsichtig, wenn Sie Eingaben akzeptieren, die über eine $_GET
- Variable an ein Skript übergeben werden.
[~ # ~] Update [~ # ~]
Laut Ihrem Kommentar besteht die beste Möglichkeit, die Zip-Datei in dasselbe Verzeichnis zu extrahieren, in dem sie sich befindet, darin, den festen Pfad zur Datei zu ermitteln und sie speziell an diesem Speicherort zu extrahieren. Sie könnten also Folgendes tun:
// 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";
}
Tun Sie das bitte nicht so (Übergabe von GET var als Teil eines Systemaufrufs). Verwenden Sie stattdessen ZipArchive .
Ihr Code sollte also so aussehen:
$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
}
Und um Ihre Frage zu beantworten, lautet Ihr Fehler "etwas $ var etwas anderes" und sollte "etwas $ var etwas anderes" sein (in doppelten Anführungszeichen).
Mit getcwd()
im selben Verzeichnis extrahieren
<?php
$unzip = new ZipArchive;
$out = $unzip->open('wordpress.Zip');
if ($out === TRUE) {
$unzip->extractTo(getcwd());
$unzip->close();
echo 'File unzipped';
} else {
echo 'Error';
}
?>
Ich habe die Antwort von @ rdlowrey auf einen saubereren und besseren Code aktualisiert. Dadurch wird eine Datei mit __DIR__
In das aktuelle Verzeichnis entpackt.
<?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>
Versuchen Sie einfach Folgendes: yourDestinationDir ist das Ziel zum Extrahieren oder Entfernen von - d yourDestinationDir zum Extrahieren in das Stammverzeichnis.
$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.Zip');
PHP hat eine eigene eingebaute Klasse, die zum Entpacken oder Extrahieren von Inhalten aus einer Zip-Datei verwendet werden kann. Die Klasse ist ZipArchive. Im Folgenden finden Sie den einfachen und einfachen Code PHP), mit dem eine Zip-Datei extrahiert und in einem bestimmten Verzeichnis abgelegt wird:
<?php
$Zip_obj = new ZipArchive;
$Zip_obj->open('dummy.Zip');
$Zip_obj->extractTo('directory_name/sub_dir');
?>
Wenn Sie einige erweiterte Funktionen wünschen, finden Sie nachfolgend den verbesserten Code, mit dem überprüft wird, ob die Zip-Datei vorhanden ist oder nicht:
<?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";
}
?>
Quelle: Wie entpacke oder extrahiere ich Zip-Dateien in PHP?
sie können die vorgepackte Funktion verwenden
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;
}
Wie man es benutzt.
if(unzip_file($file["name"],'uploads/')){
echo 'Zip archive extracted successfully';
}else{
echo 'Zip archive extraction failed';
}
Ich habe die Antwort von Morteza Ziaeemehr auf einen saubereren und besseren Code aktualisiert. Dadurch wird eine im Formular bereitgestellte Datei mit [~ # ~] 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>
Verwenden Sie den folgenden Code PHP mit dem Dateinamen im URL-Parameter "name"
<?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';
}
?>
Nur ändern
system('unzip $master.Zip');
Zu diesem
system('unzip ' . $master . '.Zip');
oder dieses
system("unzip {$master}.Zip");