Back

Как создать загрузку файлов с помощью Dropzone.js

Как создать загрузку файлов с помощью Dropzone.js

Создание современного интерфейса загрузки файлов не должно требовать борьбы со сложными конфигурациями или тяжёлыми фреймворками. Если вам нужна функциональность перетаскивания с визуальной индикацией прогресса, которая безупречно работает во всех браузерах, Dropzone.js предлагает лёгкое решение без зависимостей, которое можно реализовать за считанные минуты.

Это руководство покажет вам, как создать профессиональный интерфейс загрузки файлов с использованием Dropzone.js, включая возможности перетаскивания (drag and drop), индикаторы прогресса и валидацию файлов — всё это с помощью чистого JavaScript и без сложностей на стороне бэкенда.

Ключевые моменты

  • Dropzone.js обеспечивает загрузку файлов методом перетаскивания без каких-либо зависимостей
  • Автоматические индикаторы прогресса и предпросмотр файлов работают из коробки
  • Опции конфигурации поддерживают ограничения по типам файлов, размерам и пользовательскую валидацию
  • Совместим с любой бэкенд-технологией через стандартные multipart/form-data запросы

Начало работы с Dropzone.js

Сначала подключите Dropzone.js из CDN. Не требуются пакетные менеджеры или инструменты сборки:

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

Создание формы загрузки

Самый простой подход использует элемент формы с классом dropzone. Dropzone автоматически преобразует его в интерактивную форму загрузки:

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

Вот и всё. Пользователи теперь могут перетаскивать файлы или кликать для выбора. Конечная точка /upload получает файлы, независимо от того, используете ли вы PHP, Node.js, Python или любую другую бэкенд-технологию.

Настройка типов файлов и ограничений размера

Большинству приложений нужны ограничения на загрузку. Настройте Dropzone для принятия определённых типов файлов и ограничения размера:

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)'
};

Эта конфигурация принимает изображения, PDF и документы Word размером до 5 МБ каждый, с максимумом 10 файлов за сеанс.

Добавление индикации прогресса

Индикаторы прогресса появляются автоматически во время загрузки, но вы можете настроить их поведение с помощью обработчиков событий:

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);
        });
    }
};

Расширенная настройка фронтенда

Для большего контроля над процессом загрузки создайте пользовательскую dropzone программно:

// 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));
});

Валидация файлов и обратная связь с пользователем

Реализуйте клиентскую валидацию для немедленной обратной связи с пользователем:

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");
            }
        });
    }
};

Интеграция с любым бэкендом

Dropzone.js отправляет файлы в виде стандартных POST-запросов multipart/form-data, что делает его совместимым с любой серверной технологией. Имя параметра по умолчанию — file, но вы можете его настроить:

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

Независимо от того, работает ли ваш бэкенд на PHP, Node.js, Django или Rails, он получает стандартные запросы на загрузку файлов, которые существующий серверный код может обрабатывать без изменений.

Заключение

Dropzone.js превращает базовые поля ввода файлов в профессиональные интерфейсы загрузки с минимальным количеством кода. Его функциональность перетаскивания, автоматические индикаторы прогресса и обширные возможности настройки делают его идеальным для современных фронтенд-приложений, которые приоритизируют пользовательский опыт без добавления зависимостей от фреймворков.

Размер библиотеки в 13 КБ в сжатом виде и отсутствие зависимостей означают, что вы можете добавить продвинутые возможности загрузки файлов без раздувания вашего JavaScript-бандла или усложнения процесса сборки.

Часто задаваемые вопросы

Да, Dropzone.js поддерживает загрузку нескольких файлов по умолчанию. Вы можете контролировать параллельные загрузки с помощью опции parallelUploads и устанавливать максимальные ограничения на количество файлов с помощью maxFiles. Файлы могут загружаться индивидуально или пакетами в зависимости от вашей конфигурации.

Серверные ошибки обрабатываются через обработчик события error. Возвращайте HTTP-коды состояния, такие как 400 или 500, с вашего сервера с сообщениями об ошибках в теле ответа. Dropzone автоматически отобразит эти ошибки и пометит загрузку файла как неудачную.

Да, вы можете загружать напрямую в S3, генерируя предподписанные URL на стороне сервера и настраивая Dropzone на их использование. Устанавливайте опцию url динамически для каждого файла и включайте необходимые заголовки, такие как токены аутентификации, в опции конфигурации headers.

Dropzone автоматически генерирует миниатюры для файлов изображений. Для других типов файлов вы можете настроить шаблон предпросмотра с помощью опции previewTemplate. Настройка autoQueue false позволяет пользователям просматривать файлы перед ручным запуском загрузки.

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