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 类型应用程序/八位字节流传输。”

从手机上传文件发送应用程序/八位字节流

我们可以同时使用内容类型八位字节流和 json 吗?

文件上传错误“应用程序/八位字节流”

将八位字节流转换为图像