Как 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 .док, это прекрасно действительное изображение png. Так что не забудьте сделать больше элементов управления на стороне сервера;)
Не хотите проверять скорее на MIME, чем на любом расширении, которое пользователь лжет? Если это так, то это меньше, чем одна строка:
<input type="file" id="userfile" accept="image/*|video/*" required />
для переднего плана довольно удобно поставить'принимать' атрибут, если вы используете поле файла.
пример:
<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(""); } }