Recientemente he tenido que crear un pequeño script para subir ficheros al servidor desde una web desarrollada en PHP. Normalmente este tipo de herramientas se utilizan para subir imágenes, ficheros adjuntos o para subir un avatar en un foro. En mi caso lo he utilizado para un concurso en el que cada participante debe subir tres imágenes de su proyecto.
Para poder hacer un upload de archivos en PHP necesitamos crear un formulario con un parámetro especial enctype=”multipart/form-data”. Este parámetro permite indicar que vamos a enviar, además de texto, varios ficheros al puslar el submit del formulario. Los elementos necesarios para subir los ficheros son los input file, de los cuales crearemos tantos como deseemos (asignado a cada uno un name único).
El formulario de envío nos quedaría tal que así:
<form name=”form” action=”alta.php” method=”POST” enctype=”multipart/form-data” >
<input type=”hidden” name=”MAX_FILE_SIZE” value=”1500000″>
<input name=”nombre” value=”” size=”30″>
<input name=”email” value=”” size=”30″>
<input name=”file1″ type=”file”>
<input type=”submit” value=”Enviar”>
</form>
El fichero que gestiona los datos del formulario alta.php recibirá en el contexto 3 elementos: el name, el email, y el archivo file1. Los dos primeros los recuperaremos de forma convencional a través de $_POST, mientras que el archivo lo recuperaremos a través de $_FILES, que es un array que almacena los datos del mismo: tamaño, formato, nombre, etc. El input MAX_FILE_SIZE nos permite indicar cuál es el tamaño máximo de los archivos que se pueden subir. El valor está en kbs. Sin embargo, esto se puede comprobar posteriormente en alta.php a través de la variable size del array $_FILES. Ahora lo veremos.
<?php
$nombre_archivo = $_FILES [ “file1” ] [ “name” ];
$tipo_archivo = $_FILES [ “file1” ] [ “type” ];
$tamano_archivo = $_FILES [ “file1” ] [ “size” ];
$nombre_temp = $_FILES [ “file1” ] [ “tmp_name” ];
if (((strpos($tipo_archivo, “gif”) || strpos($tipo_archivo, “jpeg”) || strpos($tipo_archivo, “png”) && ($tamano_archivo < 1500000))) {
if (is_uploaded_file($nombre_temp)) {
copy($nombre_temp, “”directorio/”.$_FILES [ “file1” ] );
}else{
echo “Se ha producido un error al intentar subir el archivo”;
}else{
echo “El archivo seleccionado no es una imagen o excede el 1.5mb de peso”;
} ?>
Al igual que recogemos del contexto cualquier elemento de un formulario, recogeremos el array con los datos del archivo con $_FILES. Una vez hemos recuperado sus características, comprobamos que cumple con los requisitos del formulario: que es una imagen (es gif, jpg ó png), esta comprobación, en vez de hacerla con los MIMEs (‘image/jpeg’), se hace de forma más sencilla buscando la extensión en el nombre del archivo subido. Además, también se comprueba que pesa menos de 1.5mb. Podemos añadir cuantas comprobaciones deseemos, basta con meterlas a continuación del primer if.
En caso de que el fichero subido cumpla con todos los requerimientos, procederemos a alojarlo en nuestro servidor. El proceso hace una copia temporal del archivo en el servidor para su posterior tratamiento. La función is_uploaded_file se encarga de indicarnos si se ha realizado correctamente o no. En caso afirmativo, se procede a hacer una copia en nuestro servidor gracias a la función copy. Esta función recibe dos parámetros: nombre y path temporales del archivo, y el path o ruta donde queremos guardarlo. Es necesario que el directorio del ftp donde queremos alojar nuestras imágenes tenga permisos de escritura. En nuestro caso vamos a copiar los archivos en un directorio creado a tal efecto.