Permitir que los usuarios de nuestra web puedan enviar archivos directamente al servidor es una utilidad muy versátil que puede ser clave en multitud de procesos.
Algunas de las funcionalidades que podemos implementar gracias a la subida de ficheros por parte de los usuarios son:
Envío de imágenes al servidor
Un usuario quiere cambiar la foto de perfil en una red social.
Para ello deberá enviar un archivo .jpg al servidor que la almacenará para poder mostrarla en la web.
Así como GET y POST son fundamentales para la interacción del usuario con la web, la posibilidad de subir archivos representa otra vía esencial de participación en la web moderna.
Redes sociales como Facebook, Instagram o YouTube, entre muchas otras, no podrían existir sin la posibilidad de que el usuario subiese archivos.
La subida de archivos, no es una característica exclusiva de PHP, todos los lenguajes de programación web dispondrán de métodos para tratar las subidas de archivos.
La forma de envío de archivos desde el lado del cliente, será idéntica indiferentemente del lenguaje que usemos en el servidor. Si aprendemos un lenguaje de programación web distinto a PHP, simplemente deberemos aprender cómo recuperar los archivos enviados.
Como sucede con el envío de parámetros, para que un usuario pueda subir archivos al servidor, necesitamos crear un formulario HTML en nuestra página web.
Este formulario tiene que contar con tres requisitos para que se pueda realizar el envío de archivos:
Vamos a ver un ejemplo completo de formulario de envío de archivos:
<form method="post" action="index" enctype="multipart/form-data">
<input type="file" name="archivo"><br>
<button type="submit">Enviar</button>
</form>
Una vez que el usuario ha enviado el archivo al servidor, utilizaremos un array especial de PHP para recuperar el archivo y su información. Su sintaxis es la siguiente:
$_FILES['nombre_campo']El array $_FILES es multidimensional y contiene información detallada del archivo enviado, como el nombre original, la ubicación temporal, el tipo MIME y el tamaño en bytes.
$_FILES['nombre_campo']['name'] | Nombre del archivo enviado. |
$_FILES['nombre_campo']['tmp_name'] | Ruta temporal donde se ha almacenado el archivo. |
$_FILES['nombre_campo']['type'] | Tipo MIME del archivo. No debe tomarse como fiable para validar el tipo MIME del archivo. Este dato puede falsificarse desde el navegador. Recomendación: Usar finfo_file() para detectar el tipo real de archivo:$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['archivo']['tmp_name']); |
$_FILES['nombre_campo']['size'] | Tamaño en bytes del archivo. |
print_r de $_FILES
Si hacemos un print_r de $_FILES tras el envío de un archivo, obtendremos una estructura similar a la siguiente:
Array
(
[archivo1] => Array
(
[name] => factura.pdf
[type] => application/pdf
[tmp_name] => C:\xampp\tmp\php6851.tmp
[error] => 0
[size] => 4386
)
) Por defecto, el archivo se sube a un directorio temporal, pero es muy frecuente que queramos guardar este archivo de forma permanente. Para ello utilizaremos la siguiente sintaxis:
move_uploaded_file($_FILES['nombre_campo']['tmp_name'],ruta_destino);ruta_destino será la ruta donde se guardará el archivo. Podemos utilizar tanto rutas relativas (partiendo del directorio en el que se encuentra el script de PHP) como absolutas.
Ya que el usuario podría subir archivos de gran tamaño, haciendo que nuestro servidor se colapsase si no dispone de los recursos adecuados, existen varios parámetros de configuración de PHP que limitan el tamaño y el tiempo de subida.
Podemos modificar los valores de estos parámetros desde nuestro php.ini.
| Directiva | Valor habitual | Descripción |
|---|---|---|
| max_file_uploads | 20 | Número máximo de ficheros que se pueden subir de forma simultánea. |
| upload_max_filesize | 2M | Tamaño máximo de cada fichero subido. |
| post_max_size | 8M | Tamaño máximo del conjunto de datos enviados mediante POST. |
| max_input_time | 60 | Tiempo máximo en segundos de envío de datos al servidor. |
Debemos tener especial cuidado a la hora de gestionar los archivos que un usuario sube a nuestro servidor. Si permitimos que los usuarios suban cualquier tipo de archivo al servidor, podrían hacernos llegar archivos ejecutables con virus o códigos malintencionados.
Si necesitásemos guardar archivos de este tipo, siempre debemos hacerlo en una carpeta que no sea pública, ya que de lo contrario, el usuario podría lanzar la ejecución de cualquier programa.
Ataque clásico mediante envío de archivos
Al ejecutar un código PHP, el usuario puede realizar cualquier acción, pudiendo incluso borrar o modificar nuestro código fuente.
Por lo tanto, las precauciones que siempre deberemos tomar a la hora de hacer una subida de archivos son:
Aprovecha lo que ya has aprendido y completa tu formación en el curso de Programación en PHP: desarrollo de aplicaciones web dinámicas
Este sitio utiliza cookies propias y de terceros con fines analíticos anónimos, para guardar tus preferencias y garantizar el correcto funcionamiento del sitio web.
Puedes aceptar todas las cookies, rechazarlas o configurarlas según tus preferencias utilizando los botones correspondientes.
Puedes obtener más información y volver a configurar tus preferencias en cualquier momento en la Política de cookies