Lenguaje PHP

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
Estructura de archivos sistemas subir descarga con PHP
Estructura de archivos sistemas subir descarga con PHP

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"])
?>
Subir ,Descargar y Eliminar ficheros con PHP
Subir ,Descargar y Eliminar ficheros con PHP

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.

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

39 comentarios

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

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

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

  4. Muchas gracias por su ejercicio de descargas, lo utilice con algunas modificaciones en una aplicación y funciona correctamente.

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

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

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

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

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

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

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

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

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

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

Deja una respuesta

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

Botón volver arriba