Back

Cómo Crear una Carga de Archivos con Dropzone.js

Cómo Crear una Carga de Archivos con Dropzone.js

Crear una interfaz moderna de carga de archivos no debería requerir lidiar con configuraciones complejas o frameworks pesados. Si necesitas funcionalidad de arrastrar y soltar con retroalimentación visual del progreso que funcione sin problemas en todos los navegadores, Dropzone.js ofrece una solución ligera, sin dependencias, que toma minutos implementar.

Esta guía te muestra cómo crear una interfaz profesional de carga de archivos usando Dropzone.js, completa con capacidades de arrastrar y soltar, barras de progreso y validación de archivos—todo con JavaScript puro y sin complejidad en el backend.

Puntos Clave

  • Dropzone.js proporciona carga de archivos mediante arrastrar y soltar sin dependencias
  • Las barras de progreso automáticas y las vistas previas de archivos funcionan de forma inmediata
  • Las opciones de configuración admiten restricciones de tipo de archivo, límites de tamaño y validación personalizada
  • Compatible con cualquier tecnología backend a través de solicitudes estándar multipart/form-data

Primeros Pasos con Dropzone.js

Primero, incluye Dropzone.js desde un CDN. No se requieren gestores de paquetes ni herramientas de compilación:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Dropzone File Upload</title>
    <link rel="stylesheet" href="https://unpkg.com/dropzone@5.9.3/dist/min/dropzone.min.css">
</head>
<body>
    <script src="https://unpkg.com/dropzone@5.9.3/dist/min/dropzone.min.js"></script>
</body>
</html>

Creando tu Formulario de Carga

El enfoque más simple utiliza un elemento de formulario con la clase dropzone. Dropzone lo transforma automáticamente en un formulario de carga interactivo:

<form action="/upload" class="dropzone" id="my-dropzone">
    <div class="dz-message">
        Drop files here or click to upload
    </div>
</form>

Eso es todo. Los usuarios ahora pueden arrastrar y soltar archivos o hacer clic para explorar. El endpoint /upload recibe los archivos, ya sea que estés usando PHP, Node.js, Python o cualquier otra tecnología backend.

Configurando Tipos de Archivo y Límites de Tamaño

La mayoría de las aplicaciones necesitan restricciones de carga. Configura Dropzone para aceptar tipos de archivo específicos y aplicar límites de tamaño:

Dropzone.options.myDropzone = {
    acceptedFiles: 'image/*,application/pdf,.doc,.docx',
    maxFilesize: 5, // MB
    maxFiles: 10,
    addRemoveLinks: true,
    dictDefaultMessage: 'Drop files here or click to upload (Max 5MB)'
};

Esta configuración acepta imágenes, PDFs y documentos de Word de hasta 5MB cada uno, con un máximo de 10 archivos por sesión.

Añadiendo Retroalimentación con Barra de Progreso

Las barras de progreso aparecen automáticamente durante las cargas, pero puedes personalizar su comportamiento usando escuchadores de eventos:

Dropzone.options.myDropzone = {
    init: function() {
        this.on("uploadprogress", function(file, progress) {
            console.log("File progress", progress);
        });
        
        this.on("success", function(file, response) {
            console.log("Upload successful!");
        });
        
        this.on("error", function(file, errorMessage) {
            console.log("Upload failed:", errorMessage);
        });
    }
};

Personalización Avanzada del Frontend

Para tener más control sobre la experiencia de carga, crea una dropzone personalizada programáticamente:

// Disable auto-discovery for all forms
Dropzone.autoDiscover = false;

// Create custom dropzone
const myDropzone = new Dropzone("#upload-area", {
    url: "/upload",
    thumbnailWidth: 120,
    thumbnailHeight: 120,
    parallelUploads: 2,
    previewTemplate: document.getElementById('preview-template').innerHTML,
    autoQueue: false,
    previewsContainer: "#previews",
    clickable: ".fileinput-button"
});

// Manual upload trigger
document.getElementById("submit-all").addEventListener("click", function() {
    myDropzone.enqueueFiles(myDropzone.getFilesWithStatus(Dropzone.ADDED));
});

Validación de Archivos y Retroalimentación al Usuario

Implementa validación del lado del cliente para retroalimentación inmediata al usuario:

Dropzone.options.myDropzone = {
    accept: function(file, done) {
        if (file.size === 0) {
            done("Empty files are not allowed");
        } else if (file.name.length > 100) {
            done("Filename too long");
        } else {
            done(); // Accept file
        }
    },
    
    init: function() {
        this.on("addedfile", function(file) {
            // File added to queue
            if (this.files.length > this.options.maxFiles) {
                this.removeFile(file);
                alert("Maximum files exceeded");
            }
        });
    }
};

Integración con Cualquier Backend

Dropzone.js envía archivos como solicitudes POST estándar multipart/form-data, haciéndolo compatible con cualquier tecnología de servidor. El nombre de parámetro predeterminado es file, pero puedes personalizarlo:

Dropzone.options.myDropzone = {
    paramName: "upload", // Changes field name from 'file' to 'upload'
    headers: {
        "X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content
    }
};

Ya sea que tu backend ejecute PHP, Node.js, Django o Rails, recibe solicitudes de carga de archivos estándar que el código del servidor existente puede manejar sin modificaciones.

Conclusión

Dropzone.js transforma inputs básicos de archivos en interfaces de carga profesionales con código mínimo. Su funcionalidad de arrastrar y soltar, barras de progreso automáticas y amplias opciones de personalización lo hacen ideal para aplicaciones frontend modernas que priorizan la experiencia del usuario sin agregar dependencias de frameworks.

El tamaño de 13KB comprimido con gzip de la biblioteca y cero dependencias significan que puedes agregar capacidades sofisticadas de carga de archivos sin inflar tu paquete de JavaScript o complicar tu proceso de compilación.

Preguntas Frecuentes

Sí, Dropzone.js admite múltiples cargas de archivos de forma predeterminada. Puedes controlar las cargas paralelas con la opción parallelUploads y establecer límites máximos de archivos usando maxFiles. Los archivos pueden cargarse individualmente o en lotes dependiendo de tu configuración.

Los errores del servidor se manejan a través del escuchador de eventos error. Devuelve códigos de estado HTTP como 400 o 500 desde tu servidor con mensajes de error en el cuerpo de la respuesta. Dropzone mostrará automáticamente estos errores y marcará la carga del archivo como fallida.

Sí, puedes cargar directamente a S3 generando URLs prefirmadas del lado del servidor y configurando Dropzone para usarlas. Establece la opción url dinámicamente para cada archivo e incluye los encabezados necesarios como tokens de autenticación en la opción de configuración headers.

Dropzone genera automáticamente miniaturas para archivos de imagen. Para otros tipos de archivo, puedes personalizar la plantilla de vista previa usando la opción previewTemplate. La configuración autoQueue false permite a los usuarios revisar los archivos antes de activar manualmente las cargas.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay