Вложенные условные выражения логика не так?

1

Я пытаюсь сделать некоторую проверку в моей загрузке файла. Я проверяю 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');
        }
    }

Вывод в консоли:

Изображение 174551

  • 4
    ваше использование !== и || означает, что прежде всего, else if условие всегда истинно ... поскольку this.state.fileType может иметь только одно значение, поэтому оно всегда будет не равно по крайней мере двум из этих значений
  • 1
    В частности, обратите внимание, что !(a || b) - это не то же самое, что !a || !b . Вы используете последнее, но вы, вероятно, хотите первое.
Показать ещё 5 комментариев
Теги:

1 ответ

2
Лучший ответ

Второй тест здесь всегда будет иметь значение 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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню