Распакуйте файл с помощью php


Я хочу распаковать файл, и это отлично работает

system('unzip File.zip');

Но мне нужно передать имя файла через URL-адрес, и я не могу заставить его работать, вот что у меня есть.

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

Чего мне не хватает? Я знаю, что это должно быть что-то маленькое и глупое, что я упускаю из виду.

Спасибо,

 155
Author: George Garchagudashvili, 2012-01-17

12 answers

Я могу только предположить, что ваш код взят из учебника где-то в Интернете? В таком случае, хорошая работа - попытаться разобраться в этом самостоятельно. С другой стороны, тот факт, что этот код действительно может быть опубликован где-то в Интернете в качестве правильного способа распаковать файл, немного пугает.

PHP имеет встроенные расширения для работы со сжатыми файлами. Для этого не должно быть необходимости использовать вызовы system. ZipArchive документы это один из вариантов.

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

Также, как другие прокомментировали, что $HTTP_GET_VARS устарел с версии 4.1... которая была очень давно. Не используйте его. Вместо этого используйте суперглобальный $_GET.

Наконец, будьте очень осторожны, принимая любые входные данные, передаваемые сценарию через переменную $_GET.

ВСЕГДА ОЧИЩАЙТЕ ПОЛЬЗОВАТЕЛЬСКИЙ ВВОД.


ОБНОВЛЕНИЕ

Согласно вашему комментарию, лучший способ извлечь zip-файл в тот же каталог, в котором он находится, - это определить жесткий путь к файл и извлеките его специально в это место. Итак, вы могли бы сделать:

// 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";
}
 406
Author: rdlowrey, 2015-04-08 06:43:31

Пожалуйста, не делайте этого так (передавая, чтобы var был частью системного вызова). Вместо этого используйте Архив .

Итак, ваш код должен выглядеть следующим образом:

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

И чтобы ответить на ваш вопрос, ваша ошибка заключается в том, что "что-то $var что-то другое" должно быть "что-то $var что-то другое" (в двойных кавычках).

 27
Author: Aleksandar Vucetic, 2012-01-17 02:45:49

Просто попробуйте это yourdestinationdir является местом назначения для извлечения или удаления -d yourDestinationDir для извлечения в корневой каталог.

$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.zip');
 4
Author: Samuel Kwame Antwi, 2015-11-21 14:46:18

Я обновил ответ @rdlowrey на более чистый и лучший код, это позволит распаковать файл в текущий каталог с помощью __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> 
 4
Author: Morteza Ziaeemehr, 2016-01-21 10:21:39

Я обновил ответ Morteza Ziaeemehr на более чистый и лучший код, это приведет к распаковке файла, предоставленного в форме, в текущий каталог с помощью 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
Author: Varun Naharia, 2017-05-23 11:47:20

Просто измените

system('unzip $master.zip');

К этому

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

Или этот

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

 0
Author: user3225732, 2016-08-09 17:48:02

Вы можете использовать предварительно упакованную функцию

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

Как его использовать.

if(unzip_file($file["name"],'uploads/')){
echo 'zip archive extracted successfully';
}else{
  echo 'zip archive extraction failed';
}
 0
Author: user889030, 2016-10-17 10:15:24
function extract_zip($Sourse_file, $extract_folder){
    $zip = new ZipArchive() ;
    if (!$zip->open($Sourse_file) == TRUE) {
        return false;
    }
    $zip->extractTo($extract_folder);
    $zip->close();
        return true;
}
 0
Author: Cricketlog Live, 2017-03-13 03:55:20

Используйте приведенный ниже код PHP, с именем файла в параметре URL "имя"

<?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
Author: huync, 2017-04-01 14:41:52

PHP имеет свой собственный встроенный класс, который можно использовать для распаковки или извлечения содержимого из zip-файла. Класс является архивным. Ниже приведен простой и базовый PHP-код, который извлечет zip-файл и поместит его в определенный каталог:

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

Если вам нужны некоторые дополнительные функции, то ниже приведен улучшенный код, который проверит, существует ли zip-файл или нет:

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

Источник: Как распаковать или извлечь zip-файлы в PHP?

 0
Author: Faruque Ahamed Mollick, 2017-10-14 17:33:36

Использование getcwd() для извлечения в том же каталоге

<?php
$unzip = new ZipArchive;
$out = $unzip->open('wordpress.zip');
if ($out === TRUE) {
  $unzip->extractTo(getcwd());
  $unzip->close();
  echo 'File unzipped';
} else {
  echo 'Error';
}
?>
 0
Author: Rubyx, 2018-02-13 22:41:47

Просто используйте это:

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

В вашем коде $master передается как строка, система будет искать файл с именем $master.zip

  $master = $_GET["master"];
  system('unzip $master.zip'); `enter code here`
 -1
Author: Dennis Kiptugen, 2016-01-21 10:20:29