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

Программы для создания макета сайта и лучшие онлайн-сервисы

Web

Определение размера удаленного файла без загрузки файла

Как студенту попасть на стажировку в Гугл в Москве: доступные способы
Web

Как студенту попасть на стажировку в Гугл в Москве: доступные способы

Web

Удаление из массива PHP по значению (не по ключу)

×