Web

Распаковка файла с помощью php

Я хочу разархивировать файл, и это работает нормально:

system('unzip File.zip');

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

$master = $_GET["master"];

system('unzip $master.zip'); 

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

 

Ответ 1

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

$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-файл в тот же каталог, в котором он находится, — это определить жесткий путь к файлу и извлечь его именно в это место. Таким образом, вы можете сделать следующее:

// предполагая, что файл.zip находится в том же каталоге, что и выполняемый скрипт.

$file = 'file.zip';

// получаем абсолютный путь к $file

$path = pathinfo(realpath($file), PATHINFO_DIRNAME);

$zip = new ZipArchive;

$res = $zip->open($file);

if ($res === TRUE) {

  // извлекаем его на путь, который мы определили выше

  $zip->extractTo($path);

  $zip->close();

  echo "УРА! $file извлечен в $path";

} else {

  echo "Не удалось открыть $file";

}

 

 Ответ 2

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

$zipArchive = new ZipArchive();

$result = $zipArchive->open($_GET["master"]);

if ($result === TRUE) {

    $zipArchive ->extractTo("my_dir");

    $zipArchive ->close();

    // Делать что-то еще при успехе

} else {

    // Сделайте что-нибудь при ошибке

}

 И чтобы ответить на ваш вопрос: ваша ошибка "something $var something else" должна быть "something $var something else" (в двойных кавычках).

 


Ответ 3

Я обновил предыдущий ответ до более чистого и лучшего кода. Это распакует файл в текущую директорию, используя __DIR__.

<?php 

    // config

    // -------------------------------

    // только имя файла + .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

В PHP есть собственный встроенный класс, который можно использовать для разархивирования или извлечения содержимого из zip-файла. Этот класс называется ZipArchive. Ниже приведен простой и базовый 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 существует и успешно извлечен";

} else {

   echo "Этот zip-файл не существует";

}

?>

 

 Ответ 5

Еще один вариант:

<!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;">Распаковка успешно завершена!</p><br>';

                }  else  {

                    echo '<p style="color:red;">Zip файл не найден!</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"; // скрипт, в котором вы обрабатываете ввод формы.

    $.ajax({

     type: "POST",

     url: url,

     dataType:"json",

           data: $("#unzip").serialize(),// сериализует элементы формы.

           success: function(data) {

               alert(data.msg); // показать ответ php-скрипта.

               document.getElementById("unzip").reset();

             }

           });

    return false; // избежать выполнения фактической отправки формы

  });

</script>

</body>

</html> 

 

Ответ 6

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

function unzip_file($file, $destination){

    // создаем объект

    $zip = new ZipArchive() ;

    // open archive

    if ($zip->open($file) !== TRUE) {

        return false;

    }

    // извлечь содержимое в конечный каталог

    $zip->extractTo($destination);

    // закрыть архив

    $zip->close();

        return true;

}

Как использовать:

if(unzip_file($file["name"],'uploads/')){

echo 'zip архив успешно распакован';

}else{

  echo 'ошибка при распаковке zip архива';

}


Ответ 7

Используйте приведенный ниже код PHP с именем файла в параметре URL «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 'Не удается найти имя файла "''.$fileName.''". (имя файла должно включать расширение (.zip, ...))';

    }

} else {

    echo 'Пожалуйста, задайте имя файла в параметре "name" ';

}

?>

 

Ответ 8

Простая PHP-функция для распаковки. Пожалуйста, убедитесь, что на вашем сервере установлено расширение zip.

/**

 * Unzip

 * @param string $zip_file_path Eg - /tmp/my.zip

 * @param string $extract_path Eg - /tmp/new_dir_name

 * @return boolean

 */

function unzip(string $zip_file_path, string $extract_dir_path) {

    $zip = new \ZipArchive;

    $res = $zip->open($zip_file_path);

    if ($res === TRUE) {

        $zip->extractTo($extract_dir_path);

        $zip->close();

        return TRUE;

    } else {

        return FALSE;

    }

}

 

Схожие статьи

Web

Создание переменной сессии из параметра столбца mysql

Web

Преобразование строки JSON в SELECT

Можно ли заменить Google Play: лучшие бесплатные аналоги Гугл Плей
Web

Можно ли заменить Google Play: лучшие бесплатные аналоги Гугл Плей

Web

Как я могу измерить скорость кода, написанного на PHP

×