我对codeigniter上传类有一个奇怪的问题。我使用uploadify(http://www.uploadify.com)在文件上传时添加ajax支持。当文件从uploadify发送到codeigniter时,我总是收到一条消息,指出不允许使用filetype。我做了一些研究,发现问题的原因是flash,即uploadify使用的。由于某种原因,它总是发送带有application / octet-stream mime类型的文件。我尝试上传jpg,png,gif文件类型,但codeigniter始终显示类型为application / octet-stream。
有谁知道我应该如何捕获在codeigneter中使用flash上传的真实文件类型?
答案 0 :(得分:1)
我发现的唯一解决方案是添加:
'application/octet-stream'
进入application/config/mimes.php
文件,查找您需要的各种文件类型。不是特别有用,但它是唯一有效的方法。
答案 1 :(得分:0)
这里的问题是CodeIgniter上传器似乎有一个小错误,我同意@bearfriend。
上传库的is_allowed_filetype()
功能允许参数$ignore_mime
,但do_upload
功能中未提供此参数。所以我的解决方案是关闭mime检测并且(我敢说)修改核心上传类,以便文件上传检查如下所示:
if ( ! $this->is_allowed_filetype($this->detect_mime ? false : true))
**您的detect_mime参数的反转是必需的
然而,(不幸的是)存在另一个安全问题。用户可以将virus.exe重命名为allowed.jpg,仍然允许该文件。这有多糟糕取决于文件权限以及您使用文件的方式以及文件的使用方式。例如,我在这里尝试了这个想法(https://www.bleepingcomputer.com/forums/t/573945/this-looks-new-and-slipped-by-the-gmail-filters-this-morning/#entry3687679)并且没有加载,因为它不是有效的图像。不同的OS可能不同。
我的解决方案的另一个问题是,如果您决定升级CI,这些更改将会丢失(尽管可能会在以后的版本中得到改进)。
哦,CI也没有设置$this->file_type
ignore_mime
为真。如果你在上传后需要输出中的file_type,那么解决方案就是使用你自己的变量名(而不是坚持使用ignore_mime)。
答案 2 :(得分:0)
我遇到了类似的问题,发现的解决方案是创建一个MY_Upload库并覆盖设置file_type(_file_mime_type)的函数
class MY_Upload extends CI_Upload {
/**
* Override application/octet-stream on file_type
*
* @param array $file
* @return void
*/
protected function _file_mime_type($file) {
parent::_file_mime_type($file);
if ($this->file_type == 'application/octet-stream' && !empty($file['type'])) {
$this->file_type = $file['type'];
}
}
}