我正在使用 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'], '.'), '.')
PHP 可以使用 fileinfo 和 MIME Magic(已从 PHP 5.3.0 中删除)来确定文件的 MIME 类型(Kohanas 的
File::mime()
方法也是如此)。
如果这 2 个都不可用,此方法将尝试使用文件扩展名查找 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 上传的验证,因此它应该可以正常工作。