Распакуйте файл с помощью PHP
Я хочу распаковать файл, и это прекрасно работает
system('unzip File.zip');
но мне нужно передать имя файла через URL-адрес и не могу заставить его работать, это то, что у меня есть.
$master = $_GET["master"];
system('unzip $master.zip');
чего мне не хватает? Я знаю, что это должно быть что-то маленькое и глупое, что я упускаю из виду.
спасибо,
12 ответов:
Я могу только предположить, что ваш код взят из учебника где-то онлайн? В таком случае, хорошая работа, пытаясь выяснить это самостоятельно. С другой стороны, тот факт, что этот код действительно может быть опубликован в интернете где-то как правильный способ распаковать файл, немного пугает.
PHP имеет встроенные расширения для работы со сжатыми файлами. Нет необходимости использовать
systemпризывы к этому.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 файл в тот же каталог, в котором он находится, должен определить жесткий путь к файлу и извлечь его специально в это место. Итак, вы могли бы сделать:
// 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"; }
пожалуйста, не делайте этого так (передавая GET var, чтобы быть частью системного вызова). Используйте ZipArchive.
Итак, ваш код должен выглядеть так:
$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 для более чистого и лучшего кода, это будет распаковать файл, предоставленный в форме в текущий каталог с помощью реж.
<!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");
вы можете использовать функцию prepacked
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 param "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 '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`
Comments