【问题标题】:jQuery how to check if uploaded file is an image without checking extensions?jQuery如何在不检查扩展名的情况下检查上传的文件是否为图像?
【发布时间】:2015-06-30 14:29:04
【问题描述】:

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

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

一旦上传输入发生变化,它就会被调用,验证后它会上传并显示图像。目前,我只关心验证,任何帮助或想法将不胜感激!

【问题讨论】:

    标签: javascript jquery validation


    【解决方案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.
    }
    

    【讨论】:

    • 天哪,我怎么没想到这个?如此简单,但完美运行,谢谢!
    • 在 Javascript 中,变量名不应使用大写字母。
    • 当我对 docx 扩展文件尝试相同的操作时,文件类型为空。你能告诉我为什么会这样吗?我该如何检查?
    • @Varinder 可能您可以就您的尝试发表问题?这应该也可以处理 Microsoft Word 文档。
    • 这个答案不对。例如,如果您将文件的扩展名更改为 .png 或 .jpg,您将始终获得有效的图像文件,即使您的文件是 pdf、txt 或与图像无关的文件。检查@sujit 答案或this 以获得有效的解决方案
    【解决方案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】:

      请参考相关查询here。此处的答案建议将图像加载到 Image 对象中并检查其宽度和高度属性是否不为零。 我认为该技术也可以用来解决您的问题。

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

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

      【讨论】:

      【解决方案4】:

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

      var file = this.files[0];
      var fileType = file["type"];
      
      if (fileType.search('image') >= 0) {
        ...
      }
      

      【讨论】:

        【解决方案5】:

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

        尝试访问files[0].type 属性。见Using files from web applications

        $(":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' />

        【讨论】:

        • 不知何故我错过了这个 .type 东西,不需要复杂的方法,这很好用,谢谢(:
        • 只是好奇。根据您最初的问题“但是,检查扩展名不是解决方案,因为这种验证可能会导致很多问题。我想要做的是检查实际的文件类型”: - 想要检查类型属性是否真的返回除了在内部检查扩展之外的任何东西。因为,当我试图回答 OP 时,我发现当我将一个文本文件重命名为 a.png 并上传它时,即使实际文件不是一个,图像的类型属性检查也是成功的。
        【解决方案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() 函数中。

        【讨论】:

          【解决方案7】:

          您可以尝试将文件类型转换为字符串,然后像这样对该字符串进行切片:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-31
            • 1970-01-01
            • 2013-07-18
            • 1970-01-01
            • 2013-01-28
            • 2022-01-18
            • 1970-01-01
            相关资源
            最近更新 更多