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

StackOverflow https://stackoverflow.com/questions/651700

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Пример:

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

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

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

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

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

    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("");
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top