webentwicklung-frage-antwort-db.com.de

Entpacke eine Datei mit PHP

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,

183
BostonBB

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.

STETS ​​BENUTZEREINGABE SANITISIEREN.


[~ # ~] 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";
}
463
rdlowrey

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

35

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';
}
?>
7
Rubyx

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> 
5
Morteza Ziyae

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');
4

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';
}
0
user889030

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> 
0
Varun Naharia

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

?>
0
huync

Nur ändern

system('unzip $master.Zip');

Zu diesem

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

oder dieses

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

0
user3225732