Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/05/2010, 04:13
MidouCloud
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años
Puntos: 1
Descomprimir zip al subir el fichero

Buenas. Estaba encargandome de un upload de ficheros, que funciona perfectamente como se puede ver en el codigo que muestro.

Código:
<?php 


$dir = "eulen"; //Change this to the correct dir  RELATIVE TO WHERE THIS SCRIPT IS, or /full/path/

//MIME types to allow, Gif, jpeg, zip ::Edit this to your liking 
$types = array("application/pdf","image/png","image/x-png","audio/wav","image/gif","image/jpeg", "image/png", "image/pjpeg","application/x-zip-compressed","application/zip"); 
    
// Nothing to edit below here.

//Function to do a directory listing
//function scandir($dirstr) {
//	echo "<pre>\n";
//	passthru("ls -l -F $dirstr 2>&1 ");
//	echo "</pre>\n";
//}

//Check to determine if the submit button has been pressed 
if((isset($_POST['submit']))){ 

	//Shorten Variables 
	$tmp_name = $_FILES['upload']['tmp_name']; 
	$new_name = $_FILES['upload']['name']; 
	$path = $_POST['subdir'];
	$fullpath = "$dir$path/";
	$fullpath = str_replace("..", "", str_replace("\.", "", str_replace("//", "/", $fullpath)));
	$clean_name = ereg_replace("[^a-z0-9._]", "", str_replace(" ", "_", str_replace("%20", "_", strtolower($new_name) ) ) );


// lets see if we are uploading a file or doing a dir listing
	if(isset($_POST['Dir'])){
		echo "Directorio asignado en $fullpath\n";
		scandir("$fullpath");
		}else{




		//Check MIME Type 
		if ((in_array($_FILES['upload']['type'], $types)) and (!file_exists($fullpath.$clean_name))){ 

			// create a sub-directory if required
			if (!is_dir($fullpath)){
				mkdir("$fullpath", 0755);
			}
			//Move file from tmp dir to new location 
			move_uploaded_file($tmp_name,$fullpath . $clean_name); 

                        $filesize = $_FILES['userfile']['size'];

 
			echo "$clean_name of {$_FILES['upload']['size']} bytes fue correctamente guardado en $fullpath";


		}else{ 
          
			//Print Error Message 
			echo "<small>File <strong><em>{$_FILES['upload']['name']}</em></strong> No se pudo guardar - tipo de archivo incorrecto o ya existente</small><br/>"; 
			//Debug 
			$name =  $_FILES['upload']['name']; 
			$type =    $_FILES['upload']['type']; 
			$size =    $_FILES['upload']['size']; 
			$tmp =     $_FILES['upload']['name']; 
    
			echo "Name: $name<br />Type: $type<br />Size: $size<br />Tmp: $tmp";
                        

		} 
      
	} 
} else { 

} ?> 
         <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
      
<fieldset> 
<legend>Sube archivos</legend> 
<p align = "left">Elegir otro directorio por defecto <input type="checkbox" name="Dir" value="on" /><br />
Fichero a subir <input type="file" name="upload" /> <br />
Guardar en/Cambiar directorio por defecto: <input type="text" name="subdir" value="<?php $path = $_POST['subdir']; echo "$path";?>" /> (Puede estar en blanco) **El directorio será creado si no existe<br />
<input type="submit" name="submit" value="Subir fichero/cambiar carpeta" /> 
</fieldset> 
</form>
</body>
</html>


El caso, es que estaba intentando añadir la condición de que si un archivo era un zip, que lo descomprimiese al subirlo, pero por más que lo intento, no consigo que esa parte de la función funcione bien, el caso, me vendría bien ayuda para saber en que parte implementarla para evitar problemas.

Vendría siendo esto la parte que trabaja con el zip.

Código:
<?php
    $zip = zip_open($_FILES['upload']['tmp_name']);
    while($zip_entry = zip_read($zip)) {
        $entry = zip_entry_open($zip,$zip_entry);
        $filename = zip_entry_name($zip_entry);
        $target_dir = $dir.substr($filename,0,strrpos($filename,'/'));
        $filesize = zip_entry_filesize($zip_entry);
        if (is_dir($target_dir) || mkdir($target_dir)) {
            if ($filesize > 0) {
                $contents = zip_entry_read($zip_entry, $filesize);
                file_put_contents($dir.$filename,$contents);
            }
        }
    }
?>
He probado varias cosas pero no consigo que me funcione ¿Qué debería hacer?