Я хочу разархивировать файл, и это работает нормально:
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