Я пытаюсь сделать некоторую проверку в моей загрузке файла. Я проверяю 3 вещи
1) был отправлен файл? 2) тип файла правильный? 3) размер файла меньше допустимой суммы
По какой-то нечетной причине мои вложенные условные утверждения не возвращают то, что я ожидаю от них.
Я хочу, чтобы это было похоже:
если пользователь вводит файл, проверьте тип файла. Если тип файла проходит, проверьте размер файла, если размер файла передаст файл на сервер.
Когда я тестирую его на консоли, если я не отправляю файл, первый, если блок прошел, а второй терпит неудачу, когда я отправляю как правильный тип файла, так и неправильный тип файла. Кроме того, я проверил блок размера файла, и он также не работает для обоих случаев.
Вот мой код и мой вывод на консоли. Для типа файла я уже установил состояние истинного типа файла, если пользователь попытался подделать файл.
async onSubmit(e){
e.preventDefault();
console.log(this.state);
// file size bytes in mb
var fileCheck = Math.floor(Math.log(this.state.fileSize) / Math.log(1024));
console.log(fileCheck);
//Check if a uploaded photo was taken.
if(this.state.fileObject === ''){
console.log('no file was submitted');
} else if(this.state.fileType !== 'image/jpeg' || this.state.fileType !== 'image/jpg' || this.state.fileType != 'image/png'){
// check file type
console.log('wrong file type');
} else if(fileCheck >= 2){
// check file size
console.log('file is too big');
}
else {
console.log('passed all file checks');
}
}
Вывод в консоли:
Второй тест здесь всегда будет иметь значение true:
else if(this.state.fileType !== 'image/jpeg' || this.state.fileType !== 'image/jpg' || this.state.fileType != 'image/png'){
Я рекомендую вместо этого проверять массив:
const allowedFileTypes = ['image/jpeg', 'image/jpg', 'image/png'];
// ...
else if (!allowedFileTypes.includes(this.state.fileType)) {
// err, condition failed
}
.includes
- это полу-недавний метод, если вы поддерживаете древние браузеры и не используете полисы, вместо теста indexOf
:
const allowedFileTypes = ['image/jpeg', 'image/jpg', 'image/png'];
// ...
else if (allowedFileTypes.indexOf(this.state.fileType) === -1) {
// err, condition failed
}
!==
и||
означает, что прежде всего,else if
условие всегда истинно ... посколькуthis.state.fileType
может иметь только одно значение, поэтому оно всегда будет не равно по крайней мере двум из этих значений!(a || b)
- это не то же самое, что!a || !b
. Вы используете последнее, но вы, вероятно, хотите первое.