jQuery - INPUT type = File, Image FileType Параметры проверки?

Имею следующее:

<input id="user_profile_pic" name="user[profile_pic]" type="file">

На сервере я проверяю, чтобы убедиться, что это изображение, но сначала хочу проверить на стороне клиента.

Как с помощью jQuery я могу предупредить пользователя, если выбранный входной файл не является gif, jpg, png или bmp?

Спасибо


person AnApprentice    schedule 19.11.2010    source источник


Ответы (6)


Вы хотите проверить значение элемента, например:

$("#user_profile_pic").change(function() {

    var val = $(this).val();

    switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){
        case 'gif': case 'jpg': case 'png':
            alert("an image");
            break;
        default:
            $(this).val('');
            // error message here
            alert("not an image");
            break;
    }
});

Изменить

Код изменен на основе комментария - теперь удаляет значение выбранного файла, если не изображение.

person Jess Telford    schedule 19.11.2010
comment
Uncaught TypeError: Объект № ‹Объект› не имеет метода onchange - person AnApprentice; 19.11.2010
comment
.смена работает. Но это по-прежнему бесполезно, так как при возникновении ошибок он все равно выбирает и показывает файл на странице. - person AnApprentice; 19.11.2010
comment
Добавление этого сработало, .val (''); но я не знаю, насколько это уступчиво ... кто-нибудь? - person AnApprentice; 19.11.2010
comment
.val (''); - это вызов jQuery, и все, что он делает, это устанавливает для атрибута value элемента значение '' - то же самое, что и при загрузке страницы. - person Jess Telford; 19.11.2010
comment
Для гуглеров; AFAIK не все браузеры позволяют сбросить значение ввода файла. Самым элегантным кроссбраузерным решением, которое я нашел, является element.wrap('<form>').closest('form').get(0).reset(); element.unwrap(); - person Maurice; 29.01.2013

Это довольно просто, не требуется никаких проверок JavaScript. Просто напишите это, и он будет принимать только файлы изображений.

 <input type="file" multiple accept='image/*'> 
person Hardik Sondagar    schedule 18.01.2013
comment
это круто, но это не работает как проверка! это просто для удобства выбора изображения из папки с другим расширением. как вы можете видеть здесь - ›imageshack.us/a/img20/8451/switchzz.jpg - person bernte; 24.05.2013
comment
Его определение в HTML можно переопределить в некоторых браузерах, выбрав все файлы в диалоговом окне файла. Во-вторых, хотя сам по себе он не на 100% защищен от ошибок, его проверка с помощью javascript является еще одним дополнительным сдерживающим фактором в борьбе со злонамеренными действиями. В общем, вы хотите, чтобы ваш бэкэнд проверялся перед принятием, и в качестве дополнительного бонуса, проверяя и проверяя первые несколько байтов файла, чтобы подтвердить, что это тот тип, который вам действительно нужен, поскольку только расширение никогда не является средством защиты от дурака. - person chris; 09.07.2015

Вы можете использовать регулярное выражение:

var val = $("#user_profile_pic").val();
if (!val.match(/(?:gif|jpg|png|bmp)$/)) {
    // inputted file path is not an image of one of the above types
    alert("inputted file path is not an image!");
}

Конечно, вы можете добавить к регулярному выражению больше форматов. Существуют более сложные и всесторонние способы сделать это, но этот метод выполнит задачу до тех пор, пока введенный путь к файлу изображения заканчивается на стандартном расширении файла изображения.

person Alex    schedule 19.11.2010
comment
Что, если есть три входных файла, и я хочу проверить их один за другим? var val1=..., var val2=... var val3 =... if (!val.match(/(?:gif|jpg|png|bmp)$/)) { - person alisa; 28.01.2015

Могут быть браузеры, которые позволяют вам создать <img/> заданного пути, тем самым вы можете проверить, является ли это реальным изображением или нет (если нет, событие onerror должно срабатывать на изображении, и оно будет иметь ширину / высоту 0 ).

Но поскольку это работает только в некоторых браузерах и представляет собой угрозу безопасности (на мой взгляд), я бы не предлагал этого делать, поэтому мой ответ: вы не можете там ничего проверить.

Проверка расширений файлов, например, предложенных Алексом, может быть вариантом, но расширение файла не гарантирует, что это изображение. Однако в качестве простой предварительной проверки (а не проверки) это может быть полезно.

person Dr.Molle    schedule 19.11.2010

Как мы можем проверить, что пользователь выбрал файл изображения?

  • По проверке расширения файла
    Все работает как положено, текстовый файл с расширением .png проходит здесь
  • input[type=file][accept=image/*] Первоначально скрывает non-image файлы от пользователя. Но этот фильтр работает и по расширениям. И пользователь по-прежнему может вручную ввести любое существующее имя файла.
  • Мы можем проверить mime-тип результата dataUrl, он начинается с data:mimetype;base64,.... Итак, нам нужен image/* mimetype.

    var file = $('#uploadfile');
    file.on('change', function (e) {
        var reader = new FileReader();
    
        reader.onload = function() {
            var data = reader.result;
            if (data.match(/^data:image\//)) {
                $('#thumbnail').attr('src', data);
            } else {
                console.error('Not an image');
            }
        };
    
        reader.readAsDataURL(file.prop('files')[0]);
    });
    
person vp_arth    schedule 12.05.2015
comment
Это не работает, измените изображение none, например. .a pdf в .png и начинается с data: image, но не является фактическим изображением. - person Phil; 09.09.2019
comment
ни у одного источника изображений нет других типов пантомимы. pdf, упомянутый выше, имеет data:application/pdf, например - person vp_arth; 09.09.2019
comment
@ Фил, какой браузер ты используешь? Мой Chrome не использует расширение файла для распознавания типа MIME. - person vp_arth; 09.09.2019

Вы можете попробовать вот так

// Image upload validation
$(document).on('change', ':file',function () {
    const file = this.files[0];
    const fileType = file['type'];
    const validImageTypes = ['image/jpeg', 'image/png'];
    if (!validImageTypes.includes(fileType)) {
        alert('Only JPEG and PNG file types are allowed');
        this.value = '';
    }
});
person Bablu Ahmed    schedule 09.04.2019