某人

此前素未谋面、此后遥遥无期

0%

php图片上传type错误

前言

今天在用php做图片上传时,发现在ie上传失败,chrom和火狐正常,而ie报文件类型错误,于是就针对这个问题,就有了发现…

上传的MIME类型[Uploaded MIME Types]

当上传文件从客户端到Web服务器,Windows Internet Explorer使用findmimefromdata确定MIME类型。在可能的情况下,findmimefromdata返回硬编码的值从已知的MIME类型,而不是依靠在系统注册表的文件扩展名关联的MIME类型值的列表。在某些情况下,检测到的MIME类型可以不同于一般公认为向后兼容的值,如下表所示:

从上图可以看出前者才是标准的,符合常规的文件类型。

ie[678]浏览器页面效果

下面是我在ie浏览器中测试的四种类型图片

从图中不难看出,jpg和png的类型是有点问题的。而gif和bmp是比较正常的。

[image/x-png]

x前缀是给非标准MIME类型(即不在IANA注册),所以图像/x-png在MIME类型标准化是PNG。

新的内容传输编码
如果有必要,定义私有的内容传输编码值,但必须使用x-token,这是出了名的前缀“X”,表明其不规范的情况,例如,“内容传输编码:x-my-new-encoding”。附加的标准内容传输编码值必须用标准跟踪RFC指定。这样的规格必须符合要求,在RFC 2048。因此,所有的内容传输编码命名空间外,“X”是明确保留供将来使用的IETF开始。

[image/pjpeg]

pjpeg MIME类型指的是一种渐进式JPEG图像,这意味着它可以被传输和显示,而它正在加载。目标系统将提前知道它是显示一个渐进式JPEG而不是一个由MIME类型标准JPEG文件之前,甚至开始加载。它不是一个错误。只是一个功能不支持的浏览器。

[Jpg/Jpeg]的区别

JPEG的文件格式一般有两种文件扩展名:.jpg和.jpeg,这两种扩展名的实质是相同的,我们可以把*.jpg的文件改名为*.jpeg,而对文件本身不会有任何影响。严格来讲,JPEG的文件扩展名应该为.jpeg,但由于DOS时代的8.3文件名命名原则,PC机使用了.jpg的扩展名,而由于Mac并不限制扩展名的长度,因此当时苹果机上都使用了.jpeg的后缀名。虽然现在windows也可以支持任意长度的扩展名了,但大家已经习惯了.jpg的叫法,因此也就没有强制修正。这种情况类似于.htm和.html的区别。

数据结果图

以上是ie678和其他浏览器的比较结果,通过以上从和结果图可以看出来chrom和火狐是符合我们的常规标准的。

解决方案

为了ie多增加两种文件类型image/pjpeg 和 image/x-png

1
$allowMime=array('image/jpeg','image/png','image/gif','image/pjpeg','image/x-png')

参考链接

  1. mine类型查询
  2. What is the difference between “image/png” and “image/x-png”?
  3. see whatever
  4. MIME Type Detection in Windows Internet Explorer (Windows)