El protocolo HTTP nos permite enviar datos a través de sus headers. Tú puedes subir imágenes, documentos PDF, audios, videos o algún documento de texto, a decir verdad se pueden subir archivos sin importar su tipo.
Como primera medida necesitamos saber que al formulario HTML debe ser POST (por la gran cantidad de información que vamos a enviar) y agregar una encriptación especial.
Un ejemplo básico de un formulario para subir archivos.
<form enctype="multipart/form-data" action="subir.php" method="post"> Seleccione el archivo: <input name="archivo" type="file" /><br /> <input type="submit" value="Subir" /> </form>
La diferencia con los formularios que veníamos viendo es que al tag form se le agrega el atributo enctype.
Cuando el formulario es enviado recibiremos en el array $_FILES toda la información necesaria para procesarla a gusto.
La primera clave del array será el nombre usado en el formulario, es nuestro ejemplo nos llegará a subir.php $_FILES['archivo'], dentro de ese array encontraremos más índices para usar.
- name: Nos proporciona el nombre del archivo.
- type: Recibimos el tipo de archivo, por ejemplo para un archivo JPG recibimos image/jpeg o image/pjpeg.
- tmp_name: El nombre del archivo temporal sobre el servidor.
- error: el código de error, un entero de 0 a 4.
- size: un entero que proporciona el número en bytes del archivo subido.
Los códigos de error pueden ser los siguientes, PHP tiene predefinidas 5 constantes con los valores de los errores
- UPLOAD_ERR_OK (0): El archivo fue subido exitosamente sin ningún error.
- UPLOAD_ERR_INI_SIZE (1): El archivo subido supera el valor máximo definido en upload_max_file del php.ini.
- UPLOAD_ERR_FORM_SIZE (2): El archivo subido excede el valor especificado en MAX_FILE_SIZE del formulario
- UPLOAD_ERR_PARTIAL (3): Hubo un error mientras se subía el archivo y éste fue subido parcialmente
- UPLOAD_ERR_NO_FILE (4): No hay ningún archivo subido por que el usuario no seleccionó nada en el formulario
En el ejemplo siguiente, haremos una comprobación de que el archivo sea correctamente subido, sí ésta es correcta, moveremos el archivo subido a una carpeta que quede accesible para nosotros, recordemos que los archivos se suben a una carpeta temporal, por eso debemos moverlo, o copiarlo, a una carpeta a la cual podamos acceder sin que éste sea borrado. Para esto usaremos la función move_uploaded_file
<?php if(!empty($_FILES)){ if($_FILES['archivo']['error'] == UPLOAD_ERR_OK){ if(move_uploaded_file($_FILES['archivo']['tmp_name'], 'archivos/' . $_FILES['archivo']['name'])){ $msj = "El archivo fue subido correctamente"; }else{ $msj = "Error al intentar copiar el archivo"; } }else{ $msj = "Ha ocurrido un error al intentar subir el archivo: [{$_FILES['archivo']['error']}]"; } } ?> <html> <head> <title>Subir archivo con PHP</title> </head> <body> <?php if(isset($msj)){ ?> <p><?=$msj;?></p> <?php } ?> <form enctype="multipart/form-data" action="" method="post"> Seleccione el archivo: <input name="archivo" type="file" /><br /> <input type="submit" value="Subir" /> </form> </body> </html>
En este script subimos lo que es enviado en el formulario a la carpeta archivos, para poder escribir ésta debe tener los permisos necesarios para que podamos escribir sobre ella. Dependiendo del sistema operativo los permisos pueden darse de maneras diferentes, muchas veces estos también pueden ser dados a través del FTP.
En principio esto funciona sin problemas, pero el usuario estará subiendo archivos a nuestro servidor, entonces no solo tendremos que validar que el archivo haya subido satisfactoriamente, sino que también debemos estar seguros que ese archivo no pondrá en peligro nuestra aplicación.
En el capítulo de seguridad veremos en detalle que y como corroborar.