• 关于finfo_file函数获取文件mime值验证出错的问题


    今天在做图片上传 验证图片mime值时 突然发现  个别特殊情况下finfo_file 获取的MIME值不能直接使用,

    依照官方的写法是

    $finfo=finfo_open(FILEINFO_MIME);
    $mime=finfo_file($finfo,$file_path);
    finfo_close($finfo);
    alert($mime);

    这样子获得文件mime类型的

    可是今天发现这样子不行,在文件传输中假设有charset设置传输类型为二进制流的话, 就会出现相似例如以下图那样:

    能够明显的看到,这里后面多了 分号 和后面的东西charset=binary

    这里假设再进行文件mime值的验证,就算是正确合法的文件类型。也无法通过验证。由于获取到的mime值后面多了一部分二进制文件流的字符串“; charset=binary”

    $file_name = $_FILES['imgFile']['name'];

    $temp_arr = explode(".", $file_name);
    $file_ext = array_pop($temp_arr);
    $file_ext = trim($file_ext);
    $file_ext = strtolower($file_ext);

    $_mime=array('jpg'=>array('image/pjpeg','image/jpeg'),'gif'=>array('image/gif'),'png'=>array('image/x-png','image/png'),'jpeg'=>array('image/jpeg','image/pjpeg'));

    if(empty($mime) || !in_array($mime,$_mime[$file_ext])){
    alert('图片mime类型错误!');
     }

    故而须要做下特殊环境需求下的兼容性处理

    改动后的获得mime类型的兼容性通用方法例如以下(注意些列红色部分,通过正则获得正确的兼容多需求环境下的mime值正确获取):

    if(empty($mime) && function_exists('finfo_open')){
      $finfo=finfo_open(FILEINFO_MIME);
    $mime=finfo_file($finfo,$file_path);
    finfo_close($finfo);
    //兼容特应用殊环境下的文件上传mime精准验证
    $new=preg_match('/([^;]+);?

    .*$/',$mime,$match);
    if($new)   $mime=trim($match[1]);
    alert($mime);
     }

    这样就能够正确的获得兼容环境下的mime类型进行正确的文件mime合法性验证了。执行结果如图所看到的:



  • 相关阅读:
    vue过滤器filters
    vue指令
    java命令
    mysql的information_schema表
    es6 Object的keys values entries方法
    mysql information_schema.INNODB_TRX
    流动相似性例子
    【转】time 模块详解(时间获取和转换)
    查找——平衡二叉树的实现(代码超详细注释)
    py中变量名的“秘密”
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6840028.html
Copyright © 2020-2023  润新知