Вы можете загрузить файл изображения в <img>
элемент, а затем получить ширину этого элемента.
Сначала добавьте элемент контейнера в ваш HTML, чтобы держать <img>
элемент:
<form class="some_form" enctype="multipart/form-data" method="post" action="">
<input type="file" name="photo" id="photoInput" />
<input type="submit">
</form>
<div id="imgContainer"></div>
Далее, определить метод валидатора:
$.validator.addMethod('minImageWidth', function(value, element, minWidth) {
return ($(element).data('imageWidth') || 0) > minWidth;
}, function(minWidth, element) {
var imageWidth = $(element).data('imageWidth');
return (imageWidth)
? ("Your image's width must be greater than " + minWidth + "px")
: "Selected file is not an image.";
});
Примечания:
- Как вы можете видеть, метод предполагает, что он может получить ширину изображения, вызвав
.data('imageWidth')
на элемент ввода файла. Мы будем устанавливать это значение в коде, показанном ниже.
- Кроме того, метод предполагает, что когда
.data('imageWidth')
возвращает undefined
, выбранный файл не является изображением.
Вы можете теперь использовать minImageWidth
метод, как это:
var validator = $('.some_form').validate({
rules: {
photo: {
required: true,
minImageWidth: 500
}
},
messages: {
photo: {
required: "You must insert an image"
},
}
});
Наконец, добавьте обработчик изменения-событий для ввода имени файла, который создает <img>
элемент и добавляет его к контейнер. Он также установит значение .data('imageWidth')
на элемент ввода файла.
var $submitBtn = $('.some_form').find('input:submit'),
$photoInput = $('#photoInput'),
$imgContainer = $('#imgContainer');
$('#photoInput').change(function() {
$photoInput.removeData('imageWidth');
$imgContainer.hide().empty();
var file = this.files[0];
if (file.type.match(/image\/.*/)) {
$submitBtn.attr('disabled', true);
var reader = new FileReader();
reader.onload = function() {
var $img = $('<img />').attr({ src: reader.result });
$img.on('load', function() {
$imgContainer.append($img).show();
var imageWidth = $img.width();
$photoInput.data('imageWidth', imageWidth);
if (imageWidth < 500) {
$imgContainer.hide();
} else {
$img.css({ width: '400px', height: '200px' });
}
$submitBtn.attr('disabled', false);
validator.element($photoInput);
});
}
reader.readAsDataURL(file);
} else {
validator.element($photoInput);
}
});
Примечание:
- Когда изображение загружено, его ширина помещаются как
.data('imageWidth')
значение на входной файл элемент.
- Пока изображение загружается, кнопка отправки отключена, поэтому пользователь не может отправить форму.
- Проверка выполняется сразу после загрузки изображения. То есть пользователю не нужно нажимать кнопку отправки, чтобы сообщение об ошибке отображалось. Это достигается путем вызова
validator.element()
.
- Вы не можете получить ширину элемента
<img>
, пока он не будет добавлен в DOM.Он также должен быть виден, но приведенный выше код показывает, как он может быть скрыт сразу после этого.
jsfiddle
Литература:
Ширина изображения магически не отображается в элементарных данных сама по себе. Вам нужно сначала обработать файл изображения – charlietfl
@charlietfl Как бы я это сделал? – user2896120
нужно использовать API 'FileReader' – charlietfl