Cómo subir archivos al servidor con PHP

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 del POST 3 elementos: name, el email, y 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.

$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.

7 comentarios

  1. copy($nombre_temp, «‘directorio/’.$_FILES[‘file1’]»);
    este framento del condigo que esta dentro del codigo php alta.php muestra un error segun dreamweaver cs5
    me gustaria saber cual es el error que la verdad no doy con el, dice ademas que es un error de sintaxis, te agrdeceria, en tu pronta respuesta, gracias

  2. @polletexloko: Espero que te haya sido de utilidad.

    @karlos: Tienes que tener creado el directorio con el nombre ‘directorio’ para almacenar los ficheros subidos. Es probable que el error te lo de por las comillas simples y dobles, sustitúyelas y pon » y ‘.

  3. etsoy probando tu codigo pero me sale un error de esta forma
    Parse error: parse error in C:\xampp\htdocs\subir_archivo\alta.php on line 7

    kiero saber por que y si la carpeta directorio debo crearlo en la misma carpeta q mis archivos php

  4. esta bueno, trabaje con el ejemplo y resulta muy bien, el tema es que quiero guardar el archivo (foto) en una carpeta de mi servidor y la ruta en una base de datos.
    como podria modificarlo, gracias

  5. @animo: necesitaría ver todo tu código para ver dónde se está produciendo el error. El directorio donde almacenar los ficheros no hace falta que esté en el mismo que los ficheros PHP, pero ten en cuenta poner las direcciones absolutas o relativas correctamente.

    @federico: en la carpeta del servidor con el ejemplo ya lo tienes hecho. Sólo quedaría almacenar la ruta en la BBDD, que es muy sencillo, pues tienes el directorio donde lo almacenas y el nombre del fichero. Montas una cadena con $_path_directorio.$_nombre_fichero y lo insertas en la tabla que consideres de tu BBDD. Los datos de conexión, montar la query y su ejecución entiendo que los dominas, en caso contrario, coméntamelo y te ayudo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

What is 10 + 11 ?
Please leave these two fields as-is: