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

Cómo hacer un upload en PHP para subir archivos al servidor

Etiquetas:

Suscríbete a nuestro Feed para recibir las últimas novedades de diseño web, diseño gráfico y programación

8 Comentarios hasta el momento »

  1. polletexloko dijo

    19 de septiembre del 2009 a las 23:34

    gracias voy a probar a ver que tal! x]

  2. karlos dijo

    13 de mayo del 2010 a las 3:05

    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

  3. Nagash dijo

    13 de mayo del 2010 a las 8:21

    @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 ‘.

  4. animo dijo

    29 de noviembre del 2010 a las 23:52

    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

  5. federico dijo

    16 de diciembre del 2010 a las 0:49

    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

  6. Nagash dijo

    16 de diciembre del 2010 a las 11:36

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

  7. Gabo dijo

    24 de mayo del 2012 a las 8:38

    Excelente aporte, tenía algo buscando

  8. Alan dijo

    6 de julio del 2012 a las 15:36

    La información es incorrecta, probado de forma local ( sin restricciones) el ejemplo lo unico que sube es un archivo con nombre array sin extencion alguna..

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

What is 14 + 7 ?
Please leave these two fields as-is: