#javascript #function #file #input #is-empty
Вопрос:
Если я вставляю png, он работает, если я вставляю jpg, он работает, но если я оставляю файл пустым, он не работает, почему? Файл должен быть png или пустым.
function myFunction() {
var fileTypecheck = document.getElementById("file").files[0].type.replace(/(.*)//g, '');
if(fileTypecheck == "png" || fileTypecheck.length == 0){
alert("File is png or 0");
}else{
alert("File is NOT png or 0");
}
}
<input type="file" name="file" id="file" onchange="loadFile(event)" accept="image/png">
<button onclick="myFunction()">Click me</button>
Комментарии:
1. Подсказка:
files[0]
2. Что значит «это не работает»? Вы получаете сообщение об ошибке? Если да, то какое сообщение об ошибке? На первый взгляд, проблема в том, что вы пытаетесь получить доступ к свойству
files[0]
без предварительной проверки, котороеfiles
имеет длину. Если файлы не выбраны, тоfiles
будет пустой массив, поэтомуfiles[0]
будет неопределенным, что означает, что добавление.type
выдаст ошибку. Рассмотрите возможность использования дополнительной цепочки .
Ответ №1:
Когда файла нет, индекс files[0]
не сохраняется. Вы можете добавить знак вопроса (Optional_chaining) files[0]
, чтобы он не ломался при отсутствии файлов. Затем вы можете изменить fileTypecheck.length== 0
на !fileTypecheck
, поскольку он будет неопределенным, если файла нет.
function myFunction() {
var fileTypecheck = document.getElementById("file").files[0]?.type.replace(/(.*)//g, '');
if(fileTypecheck == "png" || !fileTypecheck){
alert("File is png or 0");
}else{
alert("File is NOT png or 0");
}
}
<input type="file" name="file" id="file" accept="image/png">
<button onclick="myFunction()">Click me</button>
Ответ №2:
Когда у an <input type="file"/>
нет выбранных файлов, его HTMLInputElement.files
свойство пусто, так files[0]
и есть undefined
.
Кстати, вы не должны полагаться на браузер, который всегда точно сообщает вам тип файла: браузеры обычно заполняют File.type
свойство из реестра типа file-extension-to-MIME-типа своей хост-ОС, который ненадежен и часто устарел.
Тем не менее, измените свой код на это: обратите внимание, что я добавил шаги защитного программирования, чтобы на самом деле проверять вещи, а не делать предположения:
function myFunction() {
const inp = document.getElementById("file");
if( !inp || inp.type !== 'file' ) throw new Error( "'file' input element not found." );
if( inp.files.length !== 1 ) {
alert( "Please select a single file first." );
return;
}
const file = inp.files[0];
if( file.type === 'image/png' ) {
// OK
}
else {
alert( "Please select a PNG file." );
}
}