Файл ещё не выбран.
+ Файл ещё не выбран. В этом разделе разрешены только .img, .raw и .qcow2.
Подготовка…
@@ -51,7 +51,7 @@
-
После загрузки .img/.raw прогресс начнётся заново и покажет конвертацию в qcow2. Уже готовый .qcow2 сохраняется без конвертации.
+
После загрузки .img/.raw прогресс начнётся заново и покажет конвертацию в qcow2. Установочные .iso загружаются отдельно в разделе ISO.
@@ -115,6 +115,7 @@
const statusLine = document.getElementById('upload-status');
const loadedLine = document.getElementById('upload-loaded');
const speedLine = document.getElementById('upload-speed');
+ const allowedExtensions = ['.img', '.raw', '.qcow2'];
function bytesText(bytes) {
if (!bytes) return '0 MB';
@@ -125,6 +126,12 @@
return value.toFixed(value >= 10 || i === 0 ? 0 : 1) + ' ' + units[i];
}
+ function validDiskFile(file) {
+ if (!file || !file.name) return false;
+ const lower = file.name.toLowerCase();
+ return allowedExtensions.some(ext => lower.endsWith(ext));
+ }
+
function resetProgress(title, detail) {
bar.style.width = '0%';
percent.textContent = '0%';
@@ -165,13 +172,25 @@
fileInput.addEventListener('change', function () {
const file = fileInput.files[0];
- hint.textContent = file ? file.name + ' · ' + bytesText(file.size) : 'Файл ещё не выбран.';
+ if (!file) {
+ hint.textContent = 'Файл ещё не выбран. В этом разделе разрешены только .img, .raw и .qcow2.';
+ return;
+ }
+ if (!validDiskFile(file)) {
+ hint.textContent = 'Неверный тип файла. Здесь можно выбрать только .img, .raw или .qcow2.';
+ fileInput.value = '';
+ return;
+ }
+ hint.textContent = file.name + ' · ' + bytesText(file.size);
});
form.addEventListener('submit', function (event) {
event.preventDefault();
const file = fileInput.files[0];
- if (!file) return;
+ if (!validDiskFile(file)) {
+ hint.textContent = 'Выбери образ установленной системы: .img, .raw или .qcow2.';
+ return;
+ }
const xhr = new XMLHttpRequest();
const data = new FormData(form);