客户报障,微信截图,粘贴到微信中再复制出来后为jpg格式图片,上传系统显示图片格式错误;使用原始图片上传就没问题(也是jpg格式)

查看代码,系统对图片格式的校验规则如下:

public function rules(){return [['file', 'file', 'skipOnEmpty' => false, 'extensions' => ['jpg', 'png', 'jpeg'],'maxSize' =>3*1024*1024, 'message' => 'UploadFail:upload_incorrect','tooBig' => 'InvalidFile:size_invalid','mimeTypes' => ['image/jpeg', 'image/png'],'checkExtensionByMimeType' => true,'wrongExtension' => 'InvalidFile:type_invalid','uploadRequired' => 'MissingParameter:missing_parameter','wrongMimeType' => 'InvalidFile:type_invalid'],];
}

可以看到允许拓展名为Jpg、png和jpeg;找到校验器:yii\validators\Validator,可以看到文件校验器:

查看文件校验器中校验拓展名的部分:

这里开启了checkExtensionByMimeType校验,在FileHelper::getMimeType()埋点查看系统解析出来的mimeType是image/png,令人很惊讶,于是查看FileHelper::getMimeType()方法:

这里打印出来确实解析微信截图的时候,值为impage/png ,就开始怀疑是图片本身有问题了。用getimagesize()函数验证一下这个图片:

<?php$size = getimagesize('a');
var_dump($size);

得到的返回值如下:

看来这个图片的mime type确实为image/png格式了,于是想看看图片前几个字节当中有没有什么信息,查看图片的十六进制格式:

图片前几个字节有些对应关系:

1.JPEG/JPG
- 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) 
- 文件结束标识 (2 bytes): $ff, $d9 (EOI)

2.TGA
- 未压缩的前5字节     00 00 02 00 00
- RLE压缩的前5字节     00 00 10 00 00

3.PNG
- 文件头标识 (8 bytes)     89 50 4E 47 0D 0A 1A 0A

4.GIF
- 文件头标识 (6 bytes)     47 49 46 38 39(37) 61
                                               G    I    F    8   9 (7)    a

5.BMP
- 文件头标识 (2 bytes)     42 4D
                                               B     M

6.PCX
- 文件头标识 (1 bytes)     0A

7.TIFF
- 文件头标识 (2 bytes)     4D 4D 或 49 49

8.ICO
- 文件头标识 (8 bytes)     00 00 01 00 01 00 20 20

9.CUR
- 文件头标识 (8 bytes)     00 00 02 00 01 00 20 20

10.IFF
- 文件头标识 (4 bytes)     46 4F 52 4D
                                               F    O    R    M

11.ANI
- 文件头标识 (4 bytes)     52 49 46 46
                                                R    I    F   F

  • JPEG我们知需要比对文件头的$ff, $d8这两个字符,而不用读取最后的两个结束标识了。
  • TGA,ICO,CUR只需比对第三个与第五个字符即可。
  • PNG比对[89][50]这两个字符。
  • GIF比对[47][49][46]与第五个字符。

所以问题定位出来了:微信截图,粘贴后再复制出来,虽然粘贴后缀名称是jpg格式,但是查看图片的前两个字节就能发现其实它是个png格式的。mime type格式和拓展名格式不一致导致系统校验未通过。

本文参考了:https://blog.csdn.net/july_young/article/details/80854926

PC版微信截图的bug相关推荐

  1. PC版微信,也终于上线了这个超赞的功能

    微信有3个超赞的免打扰功能,能大大提升你微信使用效率. 一个是消息免打扰. 不管是群聊,还是单聊,都可以开启免打扰. 只要是给我发过广告的微商或类微商,我都开启免打扰.会清净一些. 另一个是「折叠置顶 ...

  2. 微信 android 省略号,安卓版微信再现重大Bug,点击链接直接崩溃

    原标题:安卓版微信再现重大Bug,点击链接直接崩溃 [PConline 资讯]微信作为当下即时通信软件,日均活跃用户数量高达10亿人.就是这样一款高活跃度软件,Bug却频频出现. 3月3日,有大量网友 ...

  3. html5pc转微信小程序,微信电脑版终于支持小程序 新版PC版微信实测

    PC版的微信终于要更新了,这次给用户带来了一个新的实用功能--支持小程序!一起来看看吧.此次PC版微信的升级版本为2.7.0,目前仍处于测试版阶段.PC版微信2.7.0测试版的安装包大小为85.3 M ...

  4. PC版微信自动回复工具

    最近接到一个项目,客户要求给PC版微信添加自动回复功能,注意,客户要求的是PC版,不是安卓虚拟机版的微信,更不是网页版微信! 看了网上有介绍的使用C#开发的,使用了系统剪切板,但是这种方法有问题: 1 ...

  5. 推特用户曝Win10版微信截图 微信或将回归Win系统

    据国外科技网站Mobipicker 4月18日报道,一位推特用户发出Win 10 版微信截图,微信或将回归Windows 10 系统. 数月前,腾讯称已中止对Windows 10版本微信移动应用的开发 ...

  6. PC版微信加密图片解密思路与代码实现_Python

    PC版微信加密图片解密思路与代码实现_Python 前言 PC版的微信会加密存储用户接受到的所有图片信息. 存储路径为 C:\Users\用户名\Documents\WeChat Files\微信号\ ...

  7. PC版微信内置浏览器 缓存文件保存位置

    PC版WX内置浏览器 缓存文件保存位置 C:\Users\username\AppData\Roaming\Tencent–000\WeChat\xweb\web\Code Cache PC版微信内置 ...

  8. PC版微信  网络不可用,请检查你的网络设置 的解决方法

    PC版微信  网络不可用,请检查你的网络设置 的解决方法 win10上安装的电脑版微信总是提示 "网络不可用,请检查你的网络设置",接收信息慢,而且发送文件和图片都不成功,严重影响 ...

  9. 解密PC版微信数据库ChatMsg.db

    最近发现用Python生成词云图挺有意思的,于是想着生成微信和某个人的聊天记录的词云应该挺好玩. 在网上找了好多解密微信数据库的文章,但大多数都是解密Android版的,好不容易找到些解密PC版的还写 ...

最新文章

  1. RayTracking 光线跟踪算法
  2. rust 官服指令_RUST 命令大全(包括服务器指令)
  3. Swift 中使用 SQLite——批量更新(事务处理)
  4. malloc 和alloc及calloc的区别
  5. 【公开课】“有三说深度学习”上线
  6. 使用Django搭建web服务器(最最正确的方式)
  7. springboot报错---@RunWith(SpringRunner.class)
  8. 《在你彷徨时候,总有人在前行》
  9. Java设计模式之接口型模式总结
  10. 银联支付java代码实现_Java后端实现三方支付集成支付宝、微信、银联、光大、邮政支付...
  11. 这些屏保让你的 Mac 闲置时也能变得美观实用
  12. this指向问题(箭头函数)
  13. vs2012 +WP8sdk 开发WP8应用
  14. 笔记本双显卡 EFI 启动安装 ArchLinux
  15. 微信小程序页面界面元素自适应
  16. C++ 中的智能指针以及如何使用它们
  17. 图像分类:从13个Kaggle竞赛中总结技巧
  18. matlab 图像 whos函数,matlab图像处理常用函数
  19. ie9 下面输入框后面怎么出现一个黑色叉叉
  20. [ASP.NET]下载txt格式的文件

热门文章

  1. golang中获取字符串长度的办法
  2. linux 文件缓存大小设置,Linux文件读写机制及优化方式
  3. 大多数人都会遇到的几个H5坑(实战)
  4. WPF中的右键菜单ContextMenu
  5. SQL注入攻击及防御 手动注入+sqlmap自动化注入实战(网络安全学习12)
  6. arm linux 中littlevgl支持tslib的方法
  7. Windows 硬盘安装 Ubuntu 教程
  8. SQL多对多关系通过关联中间表查询
  9. JAVAscript中的this指向和this指向的修改
  10. 在Linux中修改系统的IP地址