Как заставить jQuery ограничивать типы файлов при загрузке? - PullRequest
132 голосов
/ 16 марта 2009

Я бы хотел, чтобы jQuery ограничивал поле загрузки файла только jpg / jpeg, png и gif. Я делаю проверку бэкэнда уже с PHP. Я запускаю кнопку отправки через функцию JavaScript, поэтому мне просто нужно знать, как проверять типы файлов перед отправкой или предупреждением.

Ответы [ 13 ]

269 голосов
/ 16 марта 2009

Вы можете получить значение поля файла точно так же, как и любое другое поле. Вы не можете изменить это, однако.

Чтобы поверхностно проверить, имеет ли файл правильное расширение, вы можете сделать что-то вроде этого:

var ext = $('#my_file_field').val().split('.').pop().toLowerCase();
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
    alert('invalid extension!');
}
37 голосов
/ 28 ноября 2012

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

$('INPUT[type="file"]').change(function () {
    var ext = this.value.match(/\.(.+)$/)[1];
    switch (ext) {
        case 'jpg':
        case 'jpeg':
        case 'png':
        case 'gif':
            $('#uploadButton').attr('disabled', false);
            break;
        default:
            alert('This is not an allowed file type.');
            this.value = '';
    }
});

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

27 голосов
/ 16 марта 2009

Вы можете использовать плагин проверки для jQuery: http://docs.jquery.com/Plugins/Validation

Бывает, что есть правило accept (), которое делает именно то, что вам нужно: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Обратите внимание, что управление расширением файла не является пуленепробиваемым, поскольку оно никоим образом не связано с mimetype файла. Таким образом, вы могли бы иметь .png, который представляет собой документ Word, и .doc, который является совершенно правильным изображением PNG. Так что не забудьте сделать больше элементов управления на стороне сервера;)

24 голосов
/ 20 августа 2014

Для внешнего интерфейса довольно удобно поставить атрибут ' accept ', если вы используете поле файла.

Пример:

<input id="file" type="file" name="file" size="30" 
       accept="image/jpg,image/png,image/jpeg,image/gif" 
/>

Пара важных замечаний:

19 голосов
/ 28 февраля 2013

Не хотите проверять скорее на MIME, чем на том расширении, которое лжет пользователь? Если так, то это менее одной строки:

<input type="file" id="userfile" accept="image/*|video/*" required />
4 голосов
/ 16 октября 2013

для моего случая я использовал следующие коды:

    if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {              
    alert('You must select an image file only');               
    }
2 голосов
/ 11 декабря 2014

Я пытаюсь написать пример рабочего кода, я тестирую его, и все работает.

Заяц - это код:

HTML:

<input type="file" class="attachment_input" name="file" onchange="checkFileSize(this, @Model.MaxSize.ToString(),@Html.Raw(Json.Encode(Model.FileExtensionsList)))" />

Javascript:

 //function for check attachment size and extention match
function checkFileSize(element, maxSize, extentionsArray) {
    var val = $(element).val(); //get file value

    var ext = val.substring(val.lastIndexOf('.') + 1).toLowerCase(); // get file extention 
    if ($.inArray(ext, extentionsArray) == -1) {
        alert('false extension!');
    }

    var fileSize = ($(element)[0].files[0].size / 1024 / 1024); //size in MB
    if (fileSize > maxSize) {
        alert("Large file");// if Maxsize from Model > real file size alert this
    }
}
1 голос
/ 21 января 2017

Этот пример позволяет загружать только изображения PNG.

HTML

<input type="file" class="form-control" id="FileUpload1" accept="image/png" />

JS

$('#FileUpload1').change(
                function () {
                    var fileExtension = ['png'];
                    if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
                        alert("Only '.png' format is allowed.");
                        this.value = ''; // Clean field
                        return false;
                    }
                });
1 голос
/ 27 сентября 2016

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

$('#ff2').change(
                function () {
                    var fileExtension = ['jpeg', 'jpg', 'pdf'];
                    if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
                        alert("Only '.jpeg','.jpg','.pdf' formats are allowed.");
                        return false; }
});
0 голосов
/ 20 января 2016

Вот простой код для проверки JavaScript, и после проверки он очистит входной файл.

<input type="file" id="image" accept="image/*" onChange="validate(this.value)"/>

function validate(file) {
    var ext = file.split(".");
    ext = ext[ext.length-1].toLowerCase();      
    var arrayExtensions = ["jpg" , "jpeg", "png", "bmp", "gif"];

    if (arrayExtensions.lastIndexOf(ext) == -1) {
        alert("Wrong extension type.");
        $("#image").val("");
    }
}
...