Як обмежити типи файлів jQuery для завантаження?


133

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

Відповіді:


280

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

Отже, щоб поверхово перевірити, чи файл має правильне розширення, ви можете зробити щось подібне:

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

18
І $("#my_upload_form").bind("submit", function() { // above check });
прив’яжіть

7
ви можете скористатися$('#file_field').change(function(){// above check});
makki

3
$("#my_upload_form").bind("submit", function() { // above check });тепер слід пов'язати за допомогою $("#my_upload_form").submit(function() { // above check }); api.jquery.com/submit . Ви також можете запобігти надсиланню форми$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
Liam

1
У цьому випадку, якщо користувач додасть, ".jpg" наприклад, файл MS Word, FileUpload прийняв би цей файл як зображення. Я думаю, що це не правильно.
Джейхун

3
Варто констатувати, що це не дурний спосіб підтвердження. Зрештою, переконайтеся, що ваш бекенд перевіряє перші кілька байтів файлу, щоб переконатися, що це невдалий тип файлу, який ви дійсно хочете. Інша річ, про яку потрібно подумати, це те, що в Linux та OSX ви можете мати файл без розширення, яке є саме того типу, який ви хочете .. так що це теж не вдасться
chris

39

Для цього завдання не потрібен плагін. Спіймав це разом із кількох інших сценаріїв:

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

Трюк тут полягає в тому, щоб встановити кнопку завантаження вимкнено, якщо і поки не буде обраний правильний тип файлу.


6
вибачте брате, але це поганий вираз. у файлах дозволяється мати крапки в його імені. "giel.asd.aaaaa.jpg.png" .match (/\.(.+)$/)
Тім Кречмер

27

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

Трапляється правило accept (), яке виконує саме те, що вам потрібно: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Зауважте, що керування розширенням файлу не є кулезахисним, оскільки воно жодним чином не пов'язане з міметиком файлу. Отже, у вас може бути .png, це слово, документ і .doc, що є абсолютно правильним PNG зображенням. Тому не забудьте зробити більше елементів управління на стороні сервера;)


чи можете ви навести приклад, як це використовувати за допомогою plugins.krajee.com/file-input#option-allowedfileextensions на IE11
shorif2000

25

Для переднього кінця досить зручно поставити атрибут ' accept ', якщо ви використовуєте поле файлу.

Приклад:

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

Кілька важливих зауважень:


1
Набагато краще, ніж використовувати JQuery
Крістофер Грігг

19

Ви не хочете перевіряти MIME, аніж будь-який факт, який користувач бреше? Якщо так, то це менше одного рядка:

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

не отримує того, що йому потрібно. просто вибрати обробку зображення з папки з різним розширенням. як ви можете бачити тут -> imageshack.us/a/img20/8451/switchzz.jpg
bernte

Оскільки це не шкодить IE <10 та не шкодить іншому коду, це ефективне обмеження на те, що ви намагаєтесь обмежити.
Лев

4

для мого випадку я використав такі коди:

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

3

Я намагаюся написати приклад робочого коду, тестую його і все працює.

Заєць - код:

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

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

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

1

Цей приклад дозволяє завантажувати лише зображення 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;
                    }
                });

Скажіть, будь ласка, як обмежити розмір зображення. Наприклад, зображення розміром 10
Мб

@PDSSandeep Перевірте це посилання pls stackoverflow.com/questions/6575159/…
Розробник

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

Тут не можна перевірити тип та розмір файлу, перевірений у FF.
Qammar Feroz

0

Якщо ви маєте справу з декількома завантаженнями файлів (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!');

        }
    }

0
    $("input[name='btnsubmit']").attr('disabled', true);
    $('input[name="filphoto"]').change(function () {
    var ext = this.value.match(/\.(.+)$/)[1];
    switch (ext) 
    {
    case 'jpg':
    case 'jpeg':
    case 'png':
    case 'bmp':
        $("input[name='btnsubmit']").attr('disabled', false);
    break;
    default:
        alert('This is not an allowed file type.');
        $("input[name='btnsubmit']").attr('disabled', true);
        this.value = '';

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

-1

Ось простий код для перевірки 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("");
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.