JQuery, как проверить, является ли загруженный файл изображением без проверки расширений?
Новичок здесь. Проблема в том, что в настоящее время я написал метод, который проверяет загруженный размер и расширение файла, чтобы проверить его. Однако проверка расширений не является решением, поскольку такая проверка может вызвать множество проблем. Я хочу, чтобы проверить фактический тип файла и проверить его без использования метода расширения. Я попытался использовать jQuery file validator, но безрезультатно... Это фрагмент из моего текущего кода:
<input type='file' id='imageLoader' name='imageLoader' accept="image/*" data-type='image' />
Script:
App.Dispatcher.on("uploadpic", function() {
$(":file").change(function() {
if (this.files && this.files[0] && this.files[0].name.match(/\.(jpg|jpeg|png|gif)$/) ) {
if(this.files[0].size>1048576) {
alert('File size is larger than 1MB!');
}
else {
var reader = new FileReader();
reader.onload = imageIsLoaded;
reader.readAsDataURL(this.files[0]);
}
} else alert('This is not an image file!');
});
function imageIsLoaded(e) {
result = e.target.result;
$('#image').attr('src', result);
};
});
Он вызывается после изменения ввода и после проверки его загрузки и отображения изображения. Пока что я только забочусь о проверке, и любая помощь или идеи будут очень признательны!
Ответы
Ответ 1
Попробуйте что-то вроде этого:
JavaScript
const file = this.files[0];
const fileType = file['type'];
const validImageTypes = ['image/gif', 'image/jpeg', 'image/png'];
if (!validImageTypes.includes(fileType)) {
// invalid file type code goes here.
}
JQuery
var file = this.files[0];
var fileType = file["type"];
var validImageTypes = ["image/gif", "image/jpeg", "image/png"];
if ($.inArray(fileType, validImageTypes) < 0) {
// invalid file type code goes here.
}
Ответ 2
Вам не нужно jquery здесь.
var mimeType=this.files[0]['type'];//mimeType=image/jpeg or application/pdf etc...
//ie image/jpeg will be ['image','jpeg'] and we keep the first value
if(mimeType.split('/')[0] === 'image'){
console.log('the file is image');
}
Вы также можете создать функцию для проверки, когда файл является изображением.
function isImage(file){
return file['type'].split('/')[0]=='image');//returns true or false
}
isImage(this.file[0]);
Обновление (es6)
использование метода es6 includes
делает его еще более простым.
const isImage = (file) => file['type'].includes('image');
Ответ 3
Вот быстрый совет, если вы просто хотите узнать, является ли файл изображением:
var file = this.files[0];
var fileType = file["type"];
if (fileType.search('image') >= 0) {
...
}
Ответ 4
Что я хочу сделать, это проверить фактический тип файла
Попробуйте получить доступ к свойству files[0].type
. См. Использование файлов из веб-приложений
$(":file").on("change", function(e) {
console.log(this.files[0].type);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type='file' id='imageLoader' name='imageLoader' accept="image/*" data-type='image' />
Ответ 5
Pls ссылается на связанный запрос здесь. Ответ здесь предполагает загрузить изображение в объект Image и проверить, чтобы его свойства ширины и высоты не равны нулю.
Я думаю, что эта техника может быть использована для решения вашей проблемы.
Я также разработал fiddle для вас. Соответствующий код ниже:
var img = new Image();
img.addEventListener("load",function(){
alert('success');
});
img.addEventListener("error",function(){
alert('error');
});
img.src = picFile.result;
Ответ 6
Если кто-то придет сюда, кто использует jQuery Validator, простой метод будет:
jQuery.validator.addMethod(
"onlyimages",
function (value, element) {
if (this.optional(element) || !element.files || !element.files[0]) {
return true;
} else {
var fileType = element.files[0].type;
var isImage = /^(image)\//i.test(fileType);
return isImage;
}
},
'Sorry, we can only accept image files.'
);
который затем добавляется в функцию .validate().