Manual de PHP: Subiendo archivos al servidor con PHP

De Foros del Web

PHP tiene un par de funciones muy simples para que un visitante, pueda mandarnos un archivo desde su computadora, y nosotros podamos guardarlo en el servidor, en el lugar y con el nombre que queramos.

Para eso, crearemos 2 archivos, uno será un formulario HTML, donde el usuario tendrá el campo para poder subir el archivo, y otro archivo, PHP, que tomara ese archivo y lo colocara en nuestro servidor.

Entonces, los archivos serán:

Formulario_Subida.html

<HTML>
<HEAD>
	<TITLE>
		YO SUBO EL ARCHIVO
	</TITLE>
</HEAD>
<BODY>	
	<FORM action="GuardarArchivo.php" method="POST" enctype="multipart/form-data"> 
		<input type="hidden" name="MAX_FILE_SIZE" value="5120">
		Subir este archivo: <br><br>
		<input name="userfile" type="file"><br><br><br>
		<input type="submit" value="Subir">
	</FORM> 
</BODY>
</HTML>

En este archivo solo tenemos 3 cosas para destacar:

La primera, es que si se va a utilizar un campo de subida de archivos, el Form debe tener el método enctype con el valor multipart/form-data. Esto es necesario par que funcione.

La segunda es el <TAG> de tipo hidden con el nombre “MAX_FILE_SIZE” que le dice al navegador el tamaño máximo del archivo a subir. Este método de control no es muy seguro ya que se puede saltear, y además depende del navegador si es tomado en cuenta o no.

La tercera es el <TAG> de tipo “file”, el cual me muestra el campo con el botón examinar, para poder seleccionar el archivo a subir. Este campo no tiene por defecto, una forma de mejorar su aspecto, o el nombre del botón. Pero se puede lograr usando CSS.


Guardar_Archivo.php

<? 
 
$nombre =  $_FILES['userfile']['name'];			//nombre con el que lo subió el usuario
$tipo =  $_FILES['userfile']['type'];			//tipo de archivo (jpg,gif,rar,txt,etc)
$tamano = $_FILES['userfile']['size'];			//tamaño del archivo en Kb; 1024Kb = 1Mb
$error = $_FILES['userfile']['error'];			//si apareció algún error en la subida
$nombre_temporal = $_FILES['userfile']['tmp_name'];	//Nombre temporal que se le asigna al archivo cuando sube a tu servidor
 
$nuevo_nombre = 'EL Archivo'
 
//Reviso que el archivo sea del tipo ZIP o RAR; y que pese menos de 5Mb
if (!((strpos($tipo, "rar") || strpos($tipo, "zip")) && ($tamano_archivo < 5120))) { 
   	echo "El tipo de archivo o el tamaño no es correcto.";
}else{ 
   	//Verifico que pueda mover el archivo y cambiarle el nombre. El archivo se guardará donde esta la pagina
	if (move_uploaded_file(FILES['userfile']['tmp_name'], $nuevo_nombre)){ 
      	 echo "El archivo subió!!."; 
   	}else{ 
      	 echo "Error al subir el archivo. Inténtelo nuevamente."; 
   	} 
} 
?>

Este es el archivo php que hace todo el trabajo.

Aunque casi todo el código esta comentado, explicaremos cada línea del código.

$_FILES = $HTTP_POST_FILES

Es una variable global, propia de PHP que obtiene todos los datos.

Esta variable esta disponible desde la versión 4.1.0, las versiones anteriores deben usar $HTTP_POST_FILES.

Para obtener estos datos le pasamos el nombre del campo (en este caso, “userfile”), que es de tipo “file”, que colocamos en el formulario de la pagina HTML.

Datos que contiene la variable:

$_FILES ['userfile'][ 'name'] Devuelve el nombre del archivo

$_FILES['userfile']['type'] Devuelve el tipo de archivo

$_FILES['userfile']['size'] Devuelve el tamaño del archivo en Kb

$_FILES['userfile']['tmp_name'] Devuelve el nombre con el que se guardo temporalmente

$_FILES['userfile']['error'] Devuelve distinto de 0 si tuvo algún error (ver la lista de errores en http://www.php.net/manual/en/features.file-upload.errors.php)

$nuevo_nombre Es una variable a la cual le asigno el valor que quiero como nombre de archivo

strpos(EnCadena, BuscarPalabra) Podríamos decir que busca una cadena de string, en otra cadena de string. No es así como funciona exactamente pero para este ejemplo no es necesario entrar en más detalles.

move_uploaded_file(NombreArchivo, Destino)

Esta es una función de PHP que, pasándole el nombre de un archivo, lo mueve al destino que se le indique.

En nuestro caso, le pasamos el nombre temporal del archivo que subimos, y le asignamos un nuevo nombre.

Al no ponerle ningún destino mas que el nombre, el destino del mismo será en la misma carpeta donde esta puesto nuestro PHP.

Verificar siempre, que la carpeta destino donde queremos mandar el archivo, tenga los permisos de escritura, de lo contrario, nos devolverá un error.

También puedes crear una pagina PHP con un poco mas de controles, y por supuesto, siempre puedes ir mejorándola.

Aca tienes un ejemplo:

Guardar_Archivo_Avz.php

<? 
//verifico que el archivo llego al servidor
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
 
	$nombre =  $_FILES['userfile']['name'];				//nombre con el que lo subió el usuario
	$tipo =  $_FILES['userfile']['type'];					//tipo de archivo (jpg,gif,rar,txt,etc)
	$tamanio = $_FILES['userfile']['size'];				//tamaño del archivo en Kb; 1024Kb = 1Mb
	$error = $_FILES['userfile']['error'];				//si aparecio algun error en la subida
	$nombre_temporal = $_FILES['userfile']['tmp_name'];	//Nombre temporal que se le asigna al archivo cuando sube a tu servidor
 
	$carpeta = 'archivos/';
	$nuevo_nombre = 'Archivo_Subido'.date('Y-m-d H:i:s'); //le concatene la fecha del momento para que no se repita el nombre
 
		//Verifico que el nombre no este vacio
	if(!empty($nombre)) {
 
			//Verifico que no tenga ningun error
		if($error==0){
 
				//Reviso que el achivo sea del tipo ZIP o RAR;
			if (strpos($tipo, "rar") || strpos($tipo, "zip")) { 
 
					//Reviso que el archivo pese menos de 5 Mb;
				if ($tamanio_archivo < 5120) { 
 
						//Verifico que pueda mover el archivo y cambiarle el nombre. 
						//El archivo se guradara donde esta esta pagina
					if (move_uploaded_file(FILES['userfile']['tmp_name'], $nuevo_nombre)){ 
 
						echo "El archivo subio."; 
					}
					else{
						echo "Ocurrió algún error al subir el fichero. No pudo guardarse."; 
					}
				}
				else{
					echo "Error con el archivo. <br> El archivo pesa mas de 5Mb";
				}
			}
			else{
				echo "Error con el archivo. <br> El archivo no es ni del tipo zip ni rar";
			}
		else{
		echo "Error con el archivo. <br> El archivotiene un error en la subida";
		}
	}
	else{
		echo "Error con el archivo. <br> El archivo no tiene nombre";
	}
}
else{
echo "El archivo no subio correctamente";
}
 
?> 
 
<php>
Herramientas personales