descomprimir - Descomprime un archivo con php
ziparchive lib php (12)
Quiero descomprimir un archivo y esto funciona bien
system(''unzip File.zip'');
Pero necesito pasar el nombre del archivo a través de la URL y no puedo hacer que funcione, esto es lo que tengo.
$master = $_GET["master"];
system(''unzip $master.zip'');
¿Qué me estoy perdiendo? Sé que tiene que ser algo pequeño y estúpido que estoy pasando por alto.
Gracias,
¿Solo puedo suponer que su código proviene de un tutorial en algún lugar en línea? En ese caso, buen trabajo tratando de resolverlo por ti mismo. Por otro lado, el hecho de que este código podría publicarse en línea en alguna parte, ya que la forma correcta de descomprimir un archivo es un poco alarmante.
PHP tiene extensiones integradas para tratar con archivos comprimidos. No debería haber necesidad de usar llamadas al system
para esto. ZipArchive
docs es una opción.
$zip = new ZipArchive;
$res = $zip->open(''file.zip'');
if ($res === TRUE) {
$zip->extractTo(''/myzips/extract_path/'');
$zip->close();
echo ''woot!'';
} else {
echo ''doh!'';
}
Además, como han comentado otros, $HTTP_GET_VARS
ha quedado en desuso desde la versión 4.1 ... que fue hace mucho tiempo atrás. No lo uses Usa el $_GET
superglobal en su lugar.
Finalmente, tenga mucho cuidado al aceptar cualquier entrada que se pase a un script a través de una variable $_GET
.
SIEMPRE SANITIZE LA ENTRADA DEL USUARIO.
ACTUALIZAR
Según su comentario, la mejor manera de extraer el archivo zip en el mismo directorio en el que reside es determinar la ruta de acceso al archivo y extraerlo específicamente a esa ubicación. Entonces, podrías hacer:
// 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";
}
PHP tiene su propia clase incorporada que se puede utilizar para descomprimir o extraer contenidos de un archivo comprimido. La clase es ZipArchive. A continuación se muestra el código PHP simple y básico que extraerá un archivo zip y lo colocará en un directorio específico:
<?php
$zip_obj = new ZipArchive;
$zip_obj->open(''dummy.zip'');
$zip_obj->extractTo(''directory_name/sub_dir'');
?>
Si desea algunas características avanzadas, a continuación se muestra el código mejorado que verificará si el archivo zip existe o no:
<?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";
}
?>
Por favor, no lo haga así (pasando GET var para ser parte de una llamada al sistema). Use docs lugar.
Por lo tanto, su código debería verse así:
$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
}
Y para responder a su pregunta, su error es "algo $ var algo más" debería ser "algo $ var algo más" (entre comillas dobles).
Simplemente intente esto yourDestinationDir es el destino para extraer o eliminar -d yourDestinationDir para extraer al directorio raíz.
$master = ''someDir/zipFileName'';
$data = system(''unzip -d yourDestinationDir ''.$master.''.zip'');
Solo cambia
system(''unzip $master.zip'');
Para este
system(''unzip '' . $master . ''.zip'');
o este
system("unzip {$master}.zip");
Solo usa esto:
$master = $_GET["master"];
system(''unzip'' $master.''.zip'');
en su código $master
se pasa como una cadena, el sistema buscará un archivo llamado $master.zip
$master = $_GET["master"];
system(''unzip $master.zip''); `enter code here`
Usando getcwd()
para extraer en el mismo directorio
<?php
$unzip = new ZipArchive;
$out = $unzip->open(''wordpress.zip'');
if ($out === TRUE) {
$unzip->extractTo(getcwd());
$unzip->close();
echo ''File unzipped'';
} else {
echo ''Error'';
}
?>
Use el siguiente código PHP, con el nombre del archivo en el "nombre" URL param
<?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'';
}
?>
puedes usar la función preempaquetada
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;
}
Cómo usarlo.
if(unzip_file($file["name"],''uploads/'')){
echo ''zip archive extracted successfully'';
}else{
echo ''zip archive extraction failed'';
}
respuesta de a un código más limpio y mejor. Esto descomprimirá un archivo proporcionado dentro del formulario en el directorio actual usando 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>
Actualicé la respuesta de @rdlowrey a un código más limpio y mejor. Esto descomprimirá un archivo en el directorio actual usando __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>
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;
}