Subir archivos al servidor con Fetch – PHP y JavaScript Tutorial

Subir archivos con API Fetch JS

Subir archivos con API Fetch JS

Este post es una actualización del artículo original “Subir archivos usando PHP, jQuery y Bootstrap” publicado en este blog hace ya varios años. En esta nueva versión, exploramos un enfoque moderno utilizando JavaScript y la API Fetch, permitiendo subir archivos de forma asíncrona sin recargar la página. Este método, que prescinde de jQuery, se adapta a las necesidades actuales de desarrollo web, facilitando una experiencia más rápida y fluida para los usuarios.

Para cargar archivos usando JavaScript, puedes usar la API fetch en combinación con FormData. Este enfoque permite enviar archivos de forma asíncrona a un servidor, como una imagen o documento, sin recargar la página. A continuación, un tutorial sobre cómo subir archivos usando fetch en JavaScript.

Prerrequisitos

Un servidor que pueda manejar la carga de archivos. Para este tutorial, asumimos que tienes un script del lado del servidor (por ejemplo, en PHP o Node.js) que pueda procesar el archivo.

Estructura HTML

Primero, necesitamos un formulario HTML donde el usuario pueda seleccionar un archivo para cargar. Para este ejemplo vamos a crear un archivo llamado (index.html) con la estructura siguiente:

En este HTML tenemos:

  • Un campo de entrada de archivo donde el usuario puede seleccionar un archivo.
  • Un botón de envío que activa la carga del archivo cuando se hace clic.
  • Un elemento de párrafo para mostrar mensajes, como mensajes de éxito o de error.

CSS: Para dar aspecto mas elegante al formulario.

Ahora, crea un archivo CSS (styles.js) para manejar darle un aspecto elegante al formulario.

JavaScript: Manejo de la Carga de Archivos con Fetch

Ahora, crea un archivo JavaScript (upload.js) para manejar la carga de archivos usando la API fetch.

Explicación:

  • FormData: Usamos el objeto FormData para recopilar el archivo y cualquier otro dato del formulario (si es necesario). Agregamos el archivo seleccionado a formData usando formData.append('file', file).
  • Solicitud Fetch: Enviamos los datos del formulario al servidor usando fetch. El cuerpo de la solicitud contiene el objeto FormData. fetch('upload.php', {...}): Envía el archivo a upload.php. Debes reemplazar upload.php con la URL real del servidor que manejará la carga del archivo.
  • Manejo de Respuesta: Después de cargar el archivo, el servidor normalmente responde con un objeto JSON. Suponemos que el servidor responde con un mensaje de éxito como este:

 

  • Verificamos si la respuesta es exitosa y mostramos el mensaje apropiado al usuario.
  • Manejo de Errores: Si ocurre un error durante el proceso de carga, lo capturamos y mostramos un mensaje de error.

Lado del Servidor: Ejemplo de Script PHP para Manejar la Carga del Archivo

El siguiente es un ejemplo de un script PHP (upload.php) que maneja la carga del archivo desde la solicitud fetch.

Explicación del Código

  1. Configuración Inicial:
    • Define el directorio uploads/ donde se guardarán los archivos.
    • Establece un límite de tamaño de archivo (2 MB en este ejemplo).
    • Define una lista de tipos MIME permitidos para que solo se acepten imágenes JPEG y PNG, además de archivos PDF.
  2. Validación del Tipo de Archivo:
    • Utiliza mime_content_type($fileTmpPath) para obtener el tipo MIME real del archivo cargado. Esto previene que un archivo malicioso se cargue con una extensión engañosa.
    • Comprueba si el tipo MIME del archivo está en la lista de tipos permitidos ($allowedTypes). Si no, devuelve un mensaje de error.
  3. Validación del Tamaño del Archivo:
    • Verifica si el tamaño del archivo excede el límite establecido. Si es así, devuelve un mensaje de error.
  4. Renombrado Único de Archivos:
    • Crea un nombre de archivo único con uniqid(), lo que evita que archivos con el mismo nombre sobrescriban otros en el directorio de destino.
  5. Manejo de Errores y Respuestas:
    • Cada posible error (tipo de archivo no permitido, tamaño excesivo, etc.) genera un mensaje específico para informar al usuario del problema.
    • Si la carga es exitosa, envía un mensaje de éxito.

Prueba de la Carga de Archivos

  1. Abre index.html en un navegador.
  2. Selecciona un archivo para cargar y haz clic en el botón “Subir”.
  3. Verifica el mensaje debajo del formulario para ver si la carga fue exitosa.
  4. Confirma que el archivo se ha subido al directorio uploads/ en tu servidor.

Notas:

  • Para que el servidor pueda almacenar archivos cargados por el usuario en un directorio, es necesario que ese directorio tenga permisos de escritura. Si el servidor no tiene permisos para escribir en el directorio uploads/, los archivos no se podrán guardar, y la carga fallará.
  • Por razones de seguridad, debes validar y sanear los archivos cargados (por ejemplo, comprobando tipos y tamaños de archivo) para evitar cargas maliciosas.

Conclusión

La carga de archivos es una funcionalidad poderosa, pero también presenta riesgos significativos si no se maneja adecuadamente. Configurar correctamente los permisos de directorio y aplicar una estricta validación y saneamiento de los archivos son pasos esenciales para proteger tanto el servidor como la aplicación. Estos controles ayudan a evitar abusos del sistema y mitigan las vulnerabilidades que podrían ser explotadas por usuarios malintencionados.

Con una configuración de permisos adecuada y validaciones de archivos, puedes ofrecer una experiencia segura y confiable de carga de archivos a los usuarios, minimizando los riesgos de seguridad y manteniendo la integridad de tu sistema.