Subir ficheros al servidor con PHP

Usando PHP podemos hacer que el usuario cargue ficheros en nuestro servidor. Para ello deberemos usar un tipo específico de formulario donde especificaremos:

  • enctype=”multipart/form-data”
  • Y el método POST

$_FILE para subir ficheros al servidor con PHP

De esta forma activaremos el uso del vector asociativo $_FILE, de similar funcionamiento a los ya estudiados como $_GET o $_POST. En $_FILE estará almacenado en fichero que tenemos que cargar.
Una vez que el fichero se sube al servidor este se aloja en un fichero la raíz de la misma carpeta donde este nuestro proyecto (dónde estemos trabajando ) con un nombre temporal. Que posteriormente deberemos cambiar usando la función move_uploaded_file.
Para que todo quede de una forma ordenada, deberemos tener en una carpeta para las subidas donde moveremos el fichero temporal con su nombre real.
Veamos un ejemplo
Atención!!!, este ejemplo esta echo para tener un fichero ej.php en …/www/ también deberemos tener una carpeta subidas en /www, que nos quedaría así: …/www/subidas/. Si se usa otra estructura, deberemos cambiar la fúnción chdir y el atributo name del input en el formulario. Además si no queremos que el fichero se cambie de carpeta no tendremos que hacer ni copy ni unlink.

Subir fichero a servidor con PHP

<!DOCTYPE html>
<html lang="es">
<head>    
    <meta charset="utf-8"/>
    <title>Subida de ficheros al servidor</title>
</head>
<?php 
//Si se ha seleccionado y enviado
if(isset($_FILES['mifichero']['tmp_name']))              
	{
	//Si el fichero se ha subido con éxito
	if (is_uploaded_file($_FILES['mifichero']['tmp_name'])) 
		{
		echo "<p>Tipo: <b>", $_FILES['mifichero']['type'], "</b></p>";  //extensión, jpg, txt...
		echo "<p>Nombre: <b>", $_FILES['mifichero']['name'], "</b></p>"; //Nombre real
		echo "<p>Tamaño: <b>", $_FILES['mifichero']['size'], "</b></p>"; //Tamaño del fichero
		move_uploaded_file($_FILES['mifichero']['tmp_name'],$_FILES['mifichero']['name']); //Cambio del nombre temporal al real
		chdir("/var/www/"); //Establecemos directorio de trabajo
		copy($_FILES['mifichero']['name'],"subidas/".$_FILES['mifichero']['name']); //Copiamos a la carpeta subidas
		unlink($_FILES['mifichero']['name']); //Eliminamos la primera copia
		}
 	//Si no hemos tenido éxito en la subida
 	else
 		{
		echo "<p>Error, asegurese de que ha introducido fichero y el tamaño es menor de 10 megas</p>";
		} 
	}
?>   
<body>
<form name="miformulario" enctype="multipart/form-data" action="ej.php" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="102400" />  
 <input type="file" name="mifichero" /> 
 <input type="submit" value="Enviar" />
 </form>
</body>
</html>

Ejercicios

  1. Para hacer subidas de ficheros no es necesario mostrar tanta información, implementa una función con esta cabecera: function subir($directorio,$carpeta). La función recibe un directorio y una carpeta donde deberá quedar almacenado finalmente el fichero, retornando TRUE si todo está correcto y FALSE en caso de error.
  2. Modifica el ejemplo para que se pueda usar con la anterior función
  3. Vamos a crear ahora una carpeta en nuestra raíz (www) llamada imágenes. Luego haremos una aplicación que nos pida X veces una imagen y la iremos colocando en la carpeta imágenes
  4. Haz un listado de la carpeta imagenes y comprueba que todas las imágenes están subidas
  5. Modifica el listado anterior para que muestre las imágénes usando en nombre como title y alt de la imagen, también puedes adapatar tanto el ancho como el alto de la imagen si fuera necesario
  6. Ejercicio resuelto usando el objeto página

    En el enlace os podéis descargar una versión del ejercicio implementada usando la clase página. Simplemente se ha añadido un método para pintar el formulario de subida de imágenes y se ha modificado la función listar para en lugar de pintar por pantalla retorne un array con las imágenes.
    Una pequeña modificación: ¿Cómo podríamos hacer para que al pulsar sobre una foto esta se borrase?.

    Originally posted 2011-03-15 19:03:33.

Deja un comentario