MIME、八位字节流和 Uploadify
Posted
技术标签:
【中文标题】MIME、八位字节流和 Uploadify【英文标题】:MIMEs, octet-stream and Uploadify 【发布时间】:2011-10-14 07:45:24 【问题描述】:我正在使用Uploadify 和Kohana,我正在创建文件上传器。用户只能上传几种类型的文件。
Kohana 内置了很棒的 MIME 类型库。我认为检查上传文件的 MIME 类型(来自 Uploadify)是否匹配设置的文件扩展名会很酷。这就是为什么我制作了一组允许的 MIME 类型。
$mimes = (array) Kohana::config('mimes');
$allowed_mimes = array_merge($mimes['bmp'], $mimes['gif'], $mimes['jpg'], $mimes['jpeg'], $mimes['png']);
接下来,我想检查上传文件的 MIME 类型是否在 $allowed_mimes
数组中。我用了in_array($file['type'], $allowed_mimes)
之类的东西。令我惊讶的是 - 文件的实际 MIME 是application/octet-stream
。无论如何,上传的文件是JPEG
图像。这怎么可能?
基本想法是我需要检查文件类型。最好的方法是什么?
编辑:
在与同事进行一些转换后,我决定检查最后一个点后的字符。喜欢virus.jpeg
是可以接受的,因为jpeg
在它的名字中。我仍然愿意寻求更好的解决方案!
$extension = ltrim(strrchr($file['name'], '.'), '.')
【问题讨论】:
$ext = pathinfo($filename, PATHINFO_EXTENSION);
将是获取扩展名的正确方法(我无法理解原始问题?)
问题是:如何检查文件类型? MIME 可以吗? application/octet-stream
到底是什么?我是如何得到 JPEG
的?我的解决方案(见编辑)好吗?
【参考方案1】:
php 可以使用fileinfo 和MIME Magic(已从PHP 5.3.0 中删除)来确定文件的MIME 类型(Kohanas 的File::mime()
方法也是如此)。
如果这两个都不可用,此方法将尝试使用文件扩展名查找 MIME 类型,这可能非常不可靠。
由于您只是尝试验证一些上传,我建议使用Upload
方法来验证它:
$validation = Validation::factory($_FILES)
->rule('Filedata', 'Upload::not_empty')
->rule('Filedata', 'Upload::valid')
->rule('Filedata', 'Upload::size', array(':value', '4M'))
->rule('Filedata', 'Upload::type', array(':value', array('bmp','jpg','jpeg','png')))
->rule('Filedata', 'Upload::image', array(':value', 1920, 1080));
请注意,Upload::image()
从 3.2.0 开始可用(您也可以将其导入旧版本)。这是我个人用于一些 Uploadify 上传的验证,所以它应该可以正常工作。
【讨论】:
以上是关于MIME、八位字节流和 Uploadify的主要内容,如果未能解决你的问题,请参考以下文章
谷歌浏览器给出警告资源解释为字体但使用 MIME 类型应用程序/八位字节流传输:
font-face+chrome+django:如何避免消息“资源解释为字体但使用 MIME 类型应用程序/八位字节流传输。”