Как jQuery ограничить типы файлов При загрузке?

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

13 ответов


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

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

var ext = $('#my_file_field').val().split('.').pop().toLowerCase();
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
    alert('invalid extension!');
}

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

$('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 = '';
    }
});

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


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

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

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


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

<input type="file" id="userfile" accept="image/*|video/*" required />

для front-end довольно удобно поставить'принимать' атрибут, если вы используете поле файла.

пример:

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

несколько важных замечаний:


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

    if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {              
    alert('You must select an image file only');               
    }

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

Заяц код:

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
    }
}

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

$('#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; }
});

этот пример позволяет загружать только 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;
                    }
                });

<form enctype="multipart/form-data">
   <input name="file" type="file" />
   <input type="submit" value="Upload" />
</form>
<script>
$('input[type=file]').change(function(){
    var file = this.files[0];
    name = file.name;
    size = file.size;
    type = file.type;
    //your validation
});
</script>

Если вы имеете дело с несколькими (html 5) загрузками файлов, я взял верхний предложенный комментарий и немного изменил его:

    var files = $('#file1')[0].files;
    var len = $('#file1').get(0).files.length;

    for (var i = 0; i < len; i++) {

        f = files[i];

        var ext = f.name.split('.').pop().toLowerCase();
        if ($.inArray(ext, ['gif', 'png', 'jpg', 'jpeg']) == -1) {
            alert('invalid extension!');

        }
    }

function validateFileExtensions(){
        var validFileExtensions = ["jpg", "jpeg", "gif", "png"];
        var fileErrors = new Array();

        $( "input:file").each(function(){
            var file = $(this).value;
            var ext = file.split('.').pop();
            if( $.inArray( ext, validFileExtensions ) == -1) {
                fileErrors.push(file);
            }
        });

        if( fileErrors.length > 0 ){
            var errorContainer = $("#validation-errors");
            for(var i=0; i < fileErrors.length; i++){
                errorContainer.append('<label for="title" class="error">* File:'+ file +' do not have a valid format!</label>');
            }
            return false;
        }
        return true;
    }

вот простой код для проверки 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("");
    }
}