Загрузка файла с прогресс-баром

Узнайте, как реализовать загрузку файлов с прогресс-баром на JavaScript. Пошаговое руководство с примерами для улучшения пользовательского интерфейса.

Привет! Сегодня я помогу тебе создать простую и удобную систему для загрузки файлов с отображением прогресса в JavaScript. Такой функционал полезен, когда пользователю нужно загружать большие файлы и важно видеть, насколько процесс продвинулся.

Давай разберем этот процесс пошагово, с подробными объяснениями каждого шага.

Шаг 1. Создание HTML-формы для загрузки файлов

Первым делом, нам нужно создать форму, которая позволит пользователю выбрать файл для загрузки. В HTML это делается с помощью элемента <input> с типом file.

HTML-шаблон:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>File Upload with Progress</title>
</head>
<body>
  <h1>Загрузка файла с прогрессом</h1>
  <form id="uploadForm">
    <input type="file" id="fileInput" name="file" />
    <button type="submit">Загрузить файл</button>
  </form>

  <!-- Прогресс-бар -->
  <progress id="progressBar" value="0" max="100" style="width: 100%;"></progress>

  <!-- Результат -->
  <div id="status"></div>

  <script src="script.js"></script>
</body>
</html>

📋 Объяснение:

  • Элемент <input type="file"> позволяет пользователю выбрать файл для загрузки.

  • Прогресс-бар <progress> отображает процент загрузки файла.

  • Элемент <div id="status"> будет использоваться для отображения сообщений о состоянии загрузки (успех или ошибка).

Шаг 2. Добавление обработчика события формы

Когда пользователь выберет файл и нажмет на кнопку "Загрузить", нам нужно перехватить это событие и передать файл на сервер. Для этого мы добавим обработчик формы и отменим её стандартное поведение (перезагрузку страницы).

Добавим обработчик в script.js:

document.getElementById('uploadForm').addEventListener('submit', function (event) {
  event.preventDefault(); // Отмена стандартного поведения формы
  const fileInput = document.getElementById('fileInput');
  const file = fileInput.files[0];

  if (file) {
    uploadFile(file); // Передаем файл в функцию для загрузки
  } else {
    alert('Пожалуйста, выберите файл.');
  }
});

🛑 Что происходит здесь:

  • Мы слушаем событие submit на форме.

  • Отменяем стандартное поведение отправки формы.

  • Проверяем, выбрал ли пользователь файл, и если да, вызываем функцию для загрузки файла uploadFile().

Шаг 3. Настройка загрузки файла с использованием XMLHttpRequest

Теперь перейдем к основной части — загрузке файла на сервер с отслеживанием прогресса. Для этого мы будем использовать объект XMLHttpRequest, который позволяет нам отправлять файлы и получать информацию о ходе загрузки.

Реализация функции uploadFile:

function uploadFile(file) {
  const xhr = new XMLHttpRequest(); // Создаем новый XMLHttpRequest
  const formData = new FormData(); // Используем FormData для отправки файла

  formData.append('file', file); // Добавляем файл в объект FormData

  // Обработчик для отслеживания прогресса загрузки
  xhr.upload.addEventListener('progress', function (event) {
    if (event.lengthComputable) {
      const percentComplete = (event.loaded / event.total) * 100;
      document.getElementById('progressBar').value = percentComplete; // Обновляем прогресс-бар
    }
  });

  // Обработчик на случай успешной загрузки
  xhr.addEventListener('load', function () {
    if (xhr.status === 200) {
      document.getElementById('status').textContent = 'Файл успешно загружен!';
    } else {
      document.getElementById('status').textContent = 'Ошибка при загрузке файла.';
    }
  });

  // Обработчик для ошибок
  xhr.addEventListener('error', function () {
    document.getElementById('status').textContent = 'Произошла ошибка при загрузке файла.';
  });

  xhr.open('POST', '/upload'); // Указываем метод и URL для отправки файла
  xhr.send(formData); // Отправляем данные
}

📦 Разбор работы:

  1. Создание XMLHttpRequest: Этот объект отвечает за отправку HTTP-запросов.

  2. FormData: Мы используем FormData для упаковки данных файла, которые будут отправлены на сервер.

  3. Отслеживание прогресса: Используем событие progress, чтобы отслеживать количество байтов, загруженных на сервер, и обновляем наш прогресс-бар.

  4. Обработка завершения загрузки: Если загрузка прошла успешно (статус 200), мы выводим сообщение об успешной загрузке, иначе показываем сообщение об ошибке.

  5. Обработка ошибок: Отслеживаем ошибку во время загрузки и уведомляем пользователя в случае сбоя.

Шаг 4. Настройка сервера для обработки файла

Чтобы завершить наш проект, нужно настроить сервер, который будет принимать файл. В качестве примера можно использовать сервер на Node.js с использованием библиотеки express и пакета multer, который помогает обрабатывать загружаемые файлы.

Пример сервера на Node.js:

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();
const upload = multer({ dest: 'uploads/' }); // Указываем папку для загрузки файлов

// Маршрут для загрузки файла
app.post('/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('Файл не был загружен.');
  }

  res.send('Файл успешно загружен!');
});

app.listen(3000, () => {
  console.log('Сервер запущен на порту 3000');
});

🌍 Объяснение:

  • Мы используем библиотеку multer для обработки загружаемых файлов.

  • Сервер принимает файл, загружает его в указанную папку (uploads/), и возвращает ответ клиенту.


Шаг 5. Тестирование

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


Заключение

Загрузка файла с прогресс-баром — это отличный способ улучшить пользовательский интерфейс, особенно при работе с большими файлами. Пользователь видит, как продвигается процесс, что делает его взаимодействие с приложением более понятным и прозрачным.

Если у тебя возникнут вопросы или ты захочешь добавить дополнительные функции, такие как поддержка нескольких файлов или отображение оставшегося времени, — дай знать! 👨‍💻

Кодик
Интерактивное обучение
программированию
Еще статьи и курсы
Главная
Курсы
Блог
Меню