jQuery如何在不检查扩展名的情况下检查上传文件是否为图片?

时间:2015-04-22 18:23:28

标签: javascript jquery validation

新手在这里。问题是我目前已经编写了一种方法来检查上传的文件大小和扩展名以便验证它。但是,检查扩展名不是解决方案,因为这种验证可能会导致很多问题。我想要做的是检查实际的文件类型并验证它而不使用扩展方法。我试图使用jQuery file validator,但无济于事......这是我当前代码的片段:

<input type='file' id='imageLoader' name='imageLoader' accept="image/*" data-type='image' />

脚本:

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

上传输入更改后调用,验证后上传并显示图像。目前,我只关心验证,非常感谢任何帮助或想法!

7 个答案:

答案 0 :(得分:49)

尝试这样的事情:

<强>的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.
}

答案 1 :(得分:18)

这里你不需要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');

答案 2 :(得分:5)

如果你只是想知道文件是否是图像,这是一个快速提示:

var file = this.files[0];
var fileType = file["type"];

if (fileType.search('image') >= 0) {
  ...
}

答案 3 :(得分:3)

请参阅相关查询here。这里的答案建议将图像加载到Image对象中,并检查它的宽度和高度属性是否为零。 我认为这项技术也可以用来解决你的问题。

我还制定了一个fiddle供您参考。以下相关代码:

var img = new Image();
img.addEventListener("load",function(){
  alert('success');
});
img.addEventListener("error",function(){
      alert('error');
});
  img.src = picFile.result; 

答案 4 :(得分:2)

  

我想要做的是检查实际的文件类型

尝试访问files[0].type媒体资源。见Using files from web applications

&#13;
&#13;
$(":file").on("change", function(e) {

  console.log(this.files[0].type);
  
})
&#13;
<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' />
&#13;
&#13;
&#13;

答案 5 :(得分:1)

如果有人来到这里使用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()函数中。

答案 6 :(得分:0)

您可以尝试将文件类型转换为字符串,然后在该字符串之后切成这样:

if(String(file.type).slice(0, 6) === 'image/') {....some code}