Привет! Сегодня я помогу тебе создать простую и удобную систему для загрузки файлов с отображением прогресса в JavaScript. Такой функционал полезен, когда пользователю нужно загружать большие файлы и важно видеть, насколько процесс продвинулся.
Давай разберем этот процесс пошагово, с подробными объяснениями каждого шага.
Первым делом, нам нужно создать форму, которая позволит пользователю выбрать файл для загрузки. В HTML это делается с помощью элемента <input>
с типом file
.
<!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">
будет использоваться для отображения сообщений о состоянии загрузки (успех или ошибка).
Когда пользователь выберет файл и нажмет на кнопку "Загрузить", нам нужно перехватить это событие и передать файл на сервер. Для этого мы добавим обработчик формы и отменим её стандартное поведение (перезагрузку страницы).
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()
.
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); // Отправляем данные
}
📦 Разбор работы:
Создание XMLHttpRequest
: Этот объект отвечает за отправку HTTP-запросов.
FormData
: Мы используем FormData
для упаковки данных файла, которые будут отправлены на сервер.
Отслеживание прогресса: Используем событие progress
, чтобы отслеживать количество байтов, загруженных на сервер, и обновляем наш прогресс-бар.
Обработка завершения загрузки: Если загрузка прошла успешно (статус 200
), мы выводим сообщение об успешной загрузке, иначе показываем сообщение об ошибке.
Обработка ошибок: Отслеживаем ошибку во время загрузки и уведомляем пользователя в случае сбоя.
Чтобы завершить наш проект, нужно настроить сервер, который будет принимать файл. В качестве примера можно использовать сервер на Node.js с использованием библиотеки express
и пакета multer
, который помогает обрабатывать загружаемые файлы.
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/
), и возвращает ответ клиенту.
Теперь, когда мы настроили как клиентскую, так и серверную часть, можно протестировать загрузку файла. Запусти сервер, открой страницу с формой загрузки, выбери файл, и ты увидишь, как прогресс-бар будет заполняться по мере загрузки файла.
Загрузка файла с прогресс-баром — это отличный способ улучшить пользовательский интерфейс, особенно при работе с большими файлами. Пользователь видит, как продвигается процесс, что делает его взаимодействие с приложением более понятным и прозрачным.
Если у тебя возникнут вопросы или ты захочешь добавить дополнительные функции, такие как поддержка нескольких файлов или отображение оставшегося времени, — дай знать! 👨💻
Не нашли нужной статьи?
Напишите нам и ее сделаем!