Bliss.js предоставляет удобные инструменты для управления файловыми
операциями в браузере, включая выбор файлов через
<input> и работу с drag-and-drop. В основе лежит
использование методов Bliss.$ и событийных привязок для
обработки пользовательских действий.
<input type="file"> и его обработкаДля выбора файлов используется стандартный элемент HTML:
<input type="file" id="fileInput" multiple>
Bliss.js позволяет легко привязать обработчик события
change к этому элементу:
Bliss('#fileInput').on('change', function(event) {
const files = event.target.files;
Array.from(files).forEach(file => {
console.log('Имя файла:', file.name);
console.log('Размер файла:', file.size);
console.log('Тип файла:', file.type);
});
});
Ключевые моменты:
files — это коллекция FileList, содержащая
все выбранные файлы.Array.from() используется для преобразования
FileList в массив для удобного перебора.File содержит свойства name,
size, type и методы для дальнейшей
работы.FormDataДля отправки файлов на сервер необходимо использовать объект
FormData. Bliss.js упрощает интеграцию с AJAX:
const input = Bliss('#fileInput')[0];
const formData = new FormData();
Array.from(input.files).forEach(file => {
formData.append('files[]', file);
});
Bliss.ajax({
url: '/upload',
method: 'POST',
data: formData,
processData: false,
contentType: false,
success(response) {
console.log('Ответ сервера:', response);
},
error(xhr) {
console.error('Ошибка загрузки:', xhr.statusText);
}
});
Важные моменты:
processData: false отключает автоматическое
преобразование данных в строку.contentType: false позволяет браузеру установить
правильный Content-Type для файлов.files[] позволяет загружать
несколько файлов одновременно.Bliss.js облегчает работу с drag-and-drop, используя события
dragover и drop:
const dropZone = Bliss('#dropZone')[0];
Bliss(dropZone).on('dragover', function(event) {
event.preventDefault();
dropZone.classList.add('drag-over');
});
Bliss(dropZone).on('dragleave', function() {
dropZone.classList.remove('drag-over');
});
Bliss(dropZone).on('drop', function(event) {
event.preventDefault();
dropZone.classList.remove('drag-over');
const files = event.dataTransfer.files;
Array.from(files).forEach(file => {
console.log('Перетащенный файл:', file.name);
});
});
Особенности:
event.preventDefault() необходим для корректной работы
drop-зоны в браузере.drag-over используется для визуальной индикации
состояния.dataTransfer.files возвращает FileList
аналогично <input type="file">.Bliss.js позволяет реализовать проверку файлов по размеру, типу или количеству:
Bliss('#fileInput').on('change', function(event) {
const files = event.target.files;
const maxSize = 5 * 1024 * 1024; // 5 МБ
const allowedTypes = ['image/jpeg', 'image/png'];
Array.from(files).forEach(file => {
if (!allowedTypes.includes(file.type)) {
console.warn('Недопустимый тип файла:', file.name);
return;
}
if (file.size > maxSize) {
console.warn('Файл слишком большой:', file.name);
return;
}
console.log('Файл прошёл проверку:', file.name);
});
});
Важные моменты:
file.type предотвращает загрузку
неподдерживаемых форматов.file.size помогает контролировать
нагрузку на сервер.FileReaderДля предварительного просмотра содержимого файлов перед отправкой
используется FileReader:
Bliss('#fileInput').on('change', function(event) {
const files = event.target.files;
Array.from(files).forEach(file => {
const reader = new FileReader();
reader.onl oad = function(e) {
console.log('Содержимое файла:', e.target.result);
};
reader.readAsDataURL(file); // для изображений
});
});
Особенности использования:
readAsDataURL() используется для получения Base64-кода
файла (например, изображений).readAsText() подходит для текстовых файлов.onload срабатывает после завершения чтения.Bliss.js интегрируется с событиями XMLHttpRequest для
отображения прогресса:
const formData = new FormData();
formData.append('file', Bliss('#fileInput')[0].files[0]);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.upload.onprogr ess = function(event) {
if (event.lengthComputable) {
const percent = (event.loaded / event.total) * 100;
console.log('Прогресс:', percent.toFixed(2) + '%');
}
};
xhr.onl oad = function() {
if (xhr.status === 200) {
console.log('Загрузка завершена');
}
};
xhr.send(formData);
Ключевые моменты:
xhr.upload.onprogress позволяет отслеживать загрузку
файла в реальном времени.event.lengthComputable проверяет возможность вычисления
процента.event.loaded и event.total используются
для расчёта прогресса.Bliss.js позволяет легко обновлять DOM при работе с файлами:
Bliss('#fileInput').on('change', function(event) {
const preview = Bliss('#preview')[0];
preview.innerHTML = '';
Array.from(event.target.files).forEach(file => {
const reader = new FileReader();
reader.onl oad = function(e) {
const img = document.createElement('img');
img.src = e.target.result;
img.alt = file.name;
img.width = 100;
preview.appendChild(img);
};
reader.readAsDataURL(file);
});
});
Особенности:
innerHTML = '' очищает предыдущие
превью.FileReader и DOM-методы совместно обеспечивают плавный
UX.Этот набор возможностей делает Bliss.js мощным инструментом для реализации современных интерфейсов загрузки файлов, сочетая простоту синтаксиса и гибкость работы с DOM, AJAX и событиями drag-and-drop.