Subir y Descargar archivos PHP: Ejemplo Completo

Subir y Descargar archivos PHP. En esta entrada, veremos a detalle los conceptos de la carga de archivos usando el lenguaje PHP. Además, veremos algunas opciones de configuración que debemos de realizar para que no exista ningún problema en la carga de archivos, todo esto lo realizaremos en PHP.
Cuando estamos programando un sistema web suelen solicitar por ejemplo: para cargar imágenes de un determinado producto, documentos PDF o archivos comprimidos, etc. Sin embargo, en casos fortuitos suelen presentar algunos inconvenientes a la hora de procesar esos ficheros.
Subir y Descargar archivos PHP: Preguntas Frecuentes
Daremos, respuestas a una serie de preguntas relacionadas al sistema mostrado.
¿Cómo configurar las opciones de PHP?
Para que no exista ningún tipo de inconvenientes tememos que realizar ajustes en PHP y debemos de verificarlo previamente. Además, veremos las opciones correspondientes a la carga de archivos PHP. Estas configuraciones se pueden hacer en el fichero php.ini.
La mayoría de los servidores web son compartidos y si poseemos un servidor compartido no tendremos acceso al fichero php.ini para realizar las configuraciones.
¿Y ahora qué hacemos?
No se preocupen que para todo hay solución, tenemos que crear un fichero llamado «.user.ini
» tal como está con su punto al inicio del nombre. Por lo tanto, este fichero tendrá todos los privilegios de esta cuenta compartida y podemos realizar las configuraciones que deseamos hacer.
Este fichero se debe de crear en la raíz de tu sitio web para que tenga efecto.
¿Qué tipo de configuraciones podemos realizar en el archivo «php.ini» o «.user.ini»?
A continuación, veremos algunos valores predeterminados útiles que `podemos cambiar de acuerdo a nuestras necesidades.
1.- Permiso de carga
Si, se debe permitir la carga de archivos HTTP y siempre debe estar declarado en «on«.
file_uploads = On
2.- Tamaño máximo permitido por archivo
Esto es muy importante y podemos configurar el tamaño máximo permitido para los ficheros y podemos cambiarlo si nuestros ficheros son superiores a «16M«. Sin embargo, por defecto está marcado en «2M«.
upload_max_filesize = 16M
3.- Numero Máximo
Define el máximo de archivos que podemos cargar mediante el método POST o GET en una sola solicitud. Además, esto se puede cambiar o disminuir. Sin embargo, si nuestro sistema de cargar de ficheros es múltiples ficheros, en este caso si podríamos incrementar la cantidad a 30 o mayor cantidad según nuestra necesidad.
max_file_uploads = 20
4.- Tamaño máximo por envío
Controla el tamaño máximo de los datos POST que PHP aceptará en un envío de formulario.
post_max_size = 20M
5.- Tiempo máximo en segundos por envío
Configura el tiempo máximo en segundos que se permite a un script analizar datos de entrada, como POST y GET. El control comienza en el momento en que PHP es invocado en el servidor y finaliza cuando la ejecución comienza.
max_input_time = 60
6. Límite de memoria
Define el tamaño permitido de la Memoria
memory_limit = 128M
7.- Numero de segundos en ejecución
Establece el número de segundos que se permite la ejecución de un script. Si esto se alcanza o sobrepasa, el script devuelve un error fatal. El límite predeterminado es de 30 segundos o, si es que existe, el valor max_execution_time
definido en el php.ini
o .user.ini
.
max_execution_time = 30
Estructura del sistema: Subir y Descargar archivos PHP
Implementaremos 3 funciones y crearemos 3 archivos para cada función:
- index.php.- Es el fichero principal que mostrara el formulario de carga de archivos, también la descarga y la eliminación de archivos
- CargarFicheros.php.- Nos permitirá subir el archivo al servidor en una determinada carpeta
- Eliminar.php.- Este archivo será el encargado de eliminar el archivo seleccionado

Proceso del sistema: Subir y Descargar archivos PHP
Una vez terminada la configuración de PHP, estaremos aptos para comprobar el proceso de carga de archivos de PHP. Veamos los pasos a continuación.
A) Crear Formulario HTML: Carga del archivo
Primeramente hay que crear 3 archivos index.php
, cargarficheros.php
, eliminar.php
. Además, también tenemos que crear una carpeta llamada «subidas
» y todos los archivos subidos se almacenarán en esta carpeta predeterminada que podemos cambiar a nuestro antojo.
Ahora necesitas crear un formulario HTML que permita al usuario final seleccionar archivo de su ordenador para cargarlo en tu servidor web, veamos el código HTML
<form method="POST" action="CargarArchivos.php" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="cargar Archivos"> </form>
Siguiendo el proceso a continuación, crearemos un archivo llamado «CargarArchivos.php
» y debe de contener el siguiente código dentro de él:
<?php // Cómo subir el archivo $fichero = $_FILES["file"]; // Cargando el fichero en la carpeta "subidas" move_uploaded_file($fichero["tmp_name"], "subidas/".$fichero["name"]); // Redirigiendo hacia atrás header("Location: " . $_SERVER["HTTP_REFERER"]); ?>
Descripción del código anterior
Al momento de ejecutar el formulario, la información será enviada a este fichero para poder procesarlo. Todo empieza, cuando el usuario ejecuta el archivo index.php en el cual podrá seleccionar el archivo y al hacer clic en el botón «Cargar Archivo
«, este código si todo está correcto almacenara el fichero en la carpeta llamado «subidas».
B) Descargar el archivo
Para descargar el archivo, vamos a mostrar una lista de todos los archivos y un botón Descargar. Pegue el siguiente código en el archivo index.php
:
<?php // Esto devolverá todos los archivos de esa carpeta $archivos = scandir("subidas"); $num=0; for ($i=2; $i<count($archivos); $i++) {$num++; ?> <!-- Visualización del nombre del archivo !--> <tr> <th scope="row"><?php echo $num;?></th> <td><?php echo $archivos[$i]; ?></td> <td><a title="Descargar Archivo" href="subidas/<?php echo $archivos[$i]; ?>" download="<?php echo $archivos[$i]; ?>" style="color: blue; font-size:18px;"> <span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> </a></td> <td><a title="Eliminar Archivo" href="Eliminar.php?name=subidas/<?php echo $archivos[$i]; ?>" style="color: red; font-size:18px;" onclick="return confirm('Esta seguro de eliminar el archivo?');"> <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> </a></td> </tr> <?php }?>
Descripción del código anterior
Al volver a cargar el fichero index.php
se observara una lista de todos tus archivos cargados, con las opciones: Nombre del archivo, Descargar fichero, eliminar archivo. Sin embargo, al hacer clic en el botón Descargar, se abrirá un cuadro de diálogo para descargar el archivo basado en su navegador web.
C) Eliminación del archivo
Este sería el último proceso y será el de borrar el archivo, el script muestra un botón y cuando se haga clic para eliminar nos mostrara una ventana de confirmación para la eliminación del archivo y si aceptamos esa ventana el fichero se eliminara completamente.
<a href="Eliminar.php?name=subidas/<?php echo $archivos[$a]; ?>" style="color: red;"> Eliminar </a>
El proceso de eliminación contempla un archivo llamado Eliminar.php y dentro de él debe de contener el siguiente script:
<?php // Usamos el comando "unlink" para borrar el fichero unlink($_GET["name"]); // Redirigiendo hacia atrás header("Location: " . $_SERVER["HTTP_REFERER"]) ?>

CONCLUSIÓN: Subir y Descargar archivos PHP
Como hemos visto el proceso de carga de archivos es muy sencillo si tomamos las recomendaciones y configuraciones que hemos detallado en este artículo.
Generalmente, suelen presentar problemas de la memoria, cantidad máxima de archivos, tamaño del fichero, que en este artículo ya le dimos solución previa.
Recordemos que la carga de archivos siempre está presente en los sistemas web y además siempre debemos de cuidar la interfaz profesional de nuestros trabajos y hemos incorporado la librería BootStrap para darle un aspecto profesional.
Descarga del sistema
Para culminar dejaremos un archivo comprimido que contiene todos los ficheros del ejercicio y son su respectiva carpeta de subidas. Espero que esta breve explicación les ayude en sus proyectos web.
¿Cómo se puede hacer, para que me liste por última carga de archivo? es decir, que el ultimo archivo que se cargue aparezca en primer lugar.
Muchas Gracias
Disculpa no funciona en MAC.
Hola, me sirvio mucho
Solo que cuando se descarga el archivo dice
Error: Sin archivos
Pero en el servidor si esta el archivo
Hola buen día, gracias por el aporte a la comunidad, pero tengo una duda de tu código, en la parte de:
scandir(«subidas»);
Si en ese directorio no tiene archivos, imprime un error en la la tabla, hasta que encuentre archivos o cargemos uno.
Como evado ese warning que nos muestra, si no existen archivos con el comando scandir.
Saludos,
Muchas gracias por compartir, me ayudaste mucho en un proyecto…
Hola buenas, excelente publicación me ayudo mucho en mi proyecto!. Consulta, sabe si se puede descargar los archivos con la carpeta incluida? he buscado en muchos foros pero ninguno descarga la carpeta completa, solo los archivos dentro de este. Si sabe me ayudaría mucho, muchas gracias :D!
Gracias por compartir tu experiencia, me sirvió de mucho este blog, gracias gracias
Muchas gracias por su ejercicio de descargas, lo utilice con algunas modificaciones en una aplicación y funciona correctamente.
Hola tengo una aplicación de carga de documentos y si funciona de manera local mediante localhost/cargaarchivos pero lo subí a un sitio y pero cuando cargo un archivo indica «Hubo un error el archivo supero el peso máximo», pero no tengo archivo php.ini para modificar eso en mi hosting y tampoco tengo un archivo .user.ini como puedo solucionar este problema
Hola Felipe
El archivo .user.ini se tiene que crear en la raiz del sitio gratuito y ahi se agrega las declaraciones necesarias para aumentar los valores de la carga del PHP.
Si no te deja crear el archivo, puedes buscar otro hosting gratuito
Saludos
Hola Néstor quiero agradecerte por brindar tus conocimientos. Mil Gracias.!!!
Hola Sergio
Gracias a ti tambien por visitar mi blog!
Serias tan amable de solucionar el problema de subir archivos PESADOS es decir 100 MB porque ahora solo me permite subir 5 MB te dejo mi gmail para que me envies el archivo .: cicuentenario2017@gmail.com
Hola MIlton
Para incrementar el tamaño en peso del fichero se debe configurar el servidor ya sea de desarrollo o producción
Para poder configurar este detalle, usted necesita incrementar el límite del tamaño de subida. Esto es, usted necesita incrementar el valor de la directiva upload_max_filesize en su archivo de php.ini.
Si usas cPanel lo puedes hacer en: Editor INI de MultiPHP, luego eliges el dominio y modificando los valores de:
a) upload_max_filesize
b) post_max_size
Puedes colocarlo la cantidad de megas que deseas que cargue el formularo
Saludos
Antes que nada gracias me sirvio mucho, una pregunta como podria integrar un campo descripción junto al nombre del archivo
hola esta muy bueno el ejemplo puedo utilizarlo para mi web…. ya lo eh publicado
Hola Puedo utilizar el ejemplo para mi web? ya lo eh publicado
Buen código anteriormente había mandado un mensaje seria bueno ponerle un patinador, debido a que hay usuarios que cargan muchos archivos serian buen ejemplar, si lo puedes integrar mucho mejor aun a si mis felicitaciones yo se poco de códigos pero esta muy genial.
En el boton examinar… como se podria colocar una imagen de icono…..
Gracias …buen tutorial
Es necesario colocar el nombre index.php o puede ser otro nombre
como lo utilizo para una plataforma estudiantil
Buenas tardes, aun sigo sin entender porque no funciona… monte el codigo en mi directorio raiz… acceso desde la web y todo va bien.. pero no carga ni borra los ficheros…
Buenos días, para ello antes debes de cargar la base de datos, un saludo
excelente ayuda, gracias…
como podria integrar la fecha y hora de carga del archivo??
Hola Jose
Hay varias maneras:
1. Usando PHP con datapiker jquery o creando una variable con valor: ‘Y-m-d H:i:s’
$fecha='Y-m-d H:i:s';
Esta variable inclusive se podria agregar al nombre del archivo.
$path=$_FILES['file']['name'];
$ext = pathinfo($path, PATHINFO_EXTENSION);
$base = pathinfo($path, PATHINFO_FILENAME);
$md5 = md5_file($path);
$name = $base.'_'date("_Y-m-d_H_i_s.").$md5.$ext;
2. Usando MySQL algo mas practico creando una columna en la tabla con nombre fecha_hora y que sea de tipo timestamp , Esto generara una fecha y hora automatica.
Excelentee aporte, muchas gracias
move_uploaded_file($fichero[«tmp_name»], «../nueva carpeta/subidas/».$fichero[«name»]);
Si puedes arle la nueva direccion a donde la coloques.
excelente guia.
gracias por compartir estos conocimientos.
me salvo de apuros.
felicitaciones
Hola nestor me a servido bastante tu código pero tengo una duda, si la carpeta subidas la tengo fuera de mi proyecto habría alguna manera de dar la dirección donde se encuentra la carpeta???
Esta excelente pero tiene fallas, una vez que eliminas no refrezca la pantalla y no podes navegar entre los directorios.
Buen dia, no me sale el boton descargar
holal nestor tengo un problema , con mi formulario para subir archivos de word,excel y otros
el problema es que cuando ingresan a la pagina para descargar todos los enunciados salen con un icono de descargar
Hola, excelente ejemplo y muy útil
quisiera ampliar su manera de trabajo, como añado un buscador de estos archivos según un numero de identificación por ejemplo y complementarlo con el codigo de descarga
buenas amigo, tengo un problema estoy usando tu ejemplo y montando lo en un servidor y al momento de eliminar el archivo no se elimina que podria estar sucediendo
HOLA NESTOR ME PODRIAS AYUDAR QUIERO CAMBIAR DE COLOR LOS CUADROS COMO PUEDO HACERLE
me sirvio gracias!!
Excelente, me alegra que te haya servido.
Saludos