Распакуйте файл с помощью php
Я хочу распаковать файл, и это отлично работает
system('unzip File.zip');
Но мне нужно передать имя файла через URL-адрес, и я не могу заставить его работать, вот что у меня есть.
$master = $_GET["master"];
system('unzip $master.zip');
Чего мне не хватает? Я знаю, что это должно быть что-то маленькое и глупое, что я упускаю из виду.
Спасибо,
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";
}
Пожалуйста, не делайте этого так (передавая, чтобы 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 что-то другое" (в двойных кавычках).
Просто попробуйте это yourdestinationdir является местом назначения для извлечения или удаления -d yourDestinationDir для извлечения в корневой каталог.
$master = 'someDir/zipFileName';
$data = system('unzip -d yourDestinationDir '.$master.'.zip');
Я обновил ответ @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>
Я обновил ответ 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>
Просто измените
system('unzip $master.zip');
К этому
system('unzip ' . $master . '.zip');
Или этот
system("unzip {$master}.zip");
Вы можете использовать предварительно упакованную функцию
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';
}
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;
}
Используйте приведенный ниже код 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';
}
?>
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";
}
?>
Использование getcwd()
для извлечения в том же каталоге
<?php
$unzip = new ZipArchive;
$out = $unzip->open('wordpress.zip');
if ($out === TRUE) {
$unzip->extractTo(getcwd());
$unzip->close();
echo 'File unzipped';
} else {
echo 'Error';
}
?>
Просто используйте это:
$master = $_GET["master"];
system('unzip' $master.'.zip');
В вашем коде $master
передается как строка, система будет искать файл с именем $master.zip
$master = $_GET["master"];
system('unzip $master.zip'); `enter code here`