Codeigniter的文件上传类方便了我们使用PHP来处理文件上传的操作,使用起来非常简单,如下:
 
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width']  = '1024';
$config['max_height']  = '768';
 
$this->load->library('upload', $config);
 
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
 
如果只是处理图片类型的文件,基本上不会遇到这个坑,如果处理到了 excel、zip、rar类型的文件,你可能就会遇到明明在 allowed_types 中允许的文件类型,最后收获了 “The filetype you are attempting to upload is not allowed.”的错误,为什么会这样呢?
 
Codeigniter的文件上传类型判断在 is_allowed_filetype 这个函数中处理,造成这个错误的主要原因是因为判断逻辑中有一个 mime 类型判断的步骤。
 
什么是 Mime 呢?
 
MIME是Multipurpose Internet Mail Extention的缩写,是描述消息内容类型的互联网标准。
 
为什么需要判断 Mime?因为如果只从文件后缀来判断文件类型,是非常危险的。不怀好意的用户可能会把一个可执行文件后缀改成图片类型,上传成功后,如果能够获得文件的地址,并且文件在可执行目录,就能够执行动态脚本,还是很危险的。著名的DedeCMS就很多这种漏洞。
 
针对不同的后缀,Codeigniter会从 config/mimes.php 文件匹配POST过来的数据中的 file_type 属性,只有一样才会校验通过,否则就会发生文件类型不匹配的错误。
 
找到问题的原因,解决起来就很方便了。我们只需要在 config/mimes.php 文件中,添加对应的后缀以及file_type 这样就能解决这个问题。下面是我为几种常见文件增加的配置:
 
'docx'     =>     array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'),
'xlsx'     =>     array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),
'xlsm'     =>     array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel.sheet.macroenabled.12', 'application/zip'),
'word'     =>     array('application/msword', 'application/octet-stream'),
'rar'     =>     array('application/octet-stream'),
'zip'     =>  array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/octet-stream'),
 
补充:我这里使用的Codeigniter是2.x版本的,至于现在3.x版本中是否还存在这个问题并没有测试,有遇到的朋友可以分享一下。
 
参考资料:

Codeigniter文件上传类型不匹配错误的更多相关文章

  1. PHP图片文件上传类型限制扩展名限制大小限制与自动检测目录创建。

    程序测试网址:http://blog.z88j.com/fileuploadexample/index.html 代码分为两部分: 一部分form表单: <!doctype html> & ...

  2. jsp页面判断文件上传类型

    <script language="javascript" type="text/javascript"> function check_file( ...

  3. input file实现多选和限制文件上传类型

    <!-- input file  accept 属性设置可上传文件的类型  multiple属性设置可多文件上传--> <!-- accept 并未真正的实现限制上传文件类型,只是在 ...

  4. uploadify 文件上传报http 302错误

    uploadify文件上传会报http 302错误,在配置文件中将处理上传的通用类取消验证, 假设上传的通用处理类是fileUpload.ashx,则在配置文件同添加下面过滤配置能解决问题. < ...

  5. input file实现多选,限制文件上传类型,图片上传前预览功能

    限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...

  6. JavaScript 文件上传类型判断

    文件上传时用到一个功能,使用html元素的input标签实现, <input id="imageFile" name="imageFile1" accep ...

  7. struts2文件上传类型的过滤

    转自:http://www.2cto.com/kf/201403/282787.html 第一种解决方案: 1.手动实现文件过滤: 判断上传的文件是否在允许的范围内定义该Action允许上传的文件类型 ...

  8. input的文件上传类型判断

    参考网址: http://www.helloweba.com/view-blog-224.html <p> <label>请选择一个图像文件:</label> &l ...

  9. codeigniter文件上传问题

    codeigniter自带的文件下载辅助函数非常简单实用,但是在处理大文件的时候,就显得捉襟见肘. 在网上找到了一个对download_helper.php文件的扩展,非常好用,记录下,遇到相同问题的 ...

随机推荐

  1. HDOJ 1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  2. android adb命令

    adb查看logcat adb logcat <TAG>:* *:S 查看指定TAG的Log adb查看最上层activity:linux: adb shell dumpsys activ ...

  3. ArcGis for Android 工作与学习

    ArcGis安装 需求 windows7(32/64) Eclipse3.6以上版本 Android Sdk 2.2以上 Jdk 7 安装步骤 Eclipse安装 下载ArcGis插件 在Eclips ...

  4. sql 默认id为1000

    创建索引: alter table resource AUTO_INCREMENT=1000;  //id默认自增为1000:

  5. [nodejs] Error: unable to verify the first certificate

    Error: unable to verify the first certificate Solution npm config set registry http://registry.npmjs ...

  6. Spring Mvc + Mybatis + sqlserver maven

    mybatis config  datasource: <!-- 配置数据源 使用的是Druid数据源 --> <bean name="dataSource" c ...

  7. mvc中测试网络

    .//控制器层面 public string IsAnyNetworkAvailable() { try { foreach (NetworkInterface ni in NetworkInterf ...

  8. Android动画之淡入淡出

    为了更好的说明Android动画的淡入淡出效果,这里以一个场景为例: 界面上有两个View 控件,两个View交替显示,当一个View淡入显示,另一个View淡出不可见. 我们把当前要显示的View叫 ...

  9. ubuntu16.04.1下的mysql修改默认编码

    在Ubuntu 下配置 Mysql 的字符编码.安装完 Mysql 后,系统默认的字符编码是 latin1 ,输入的是中文,可是输出却是一堆乱码.现在要做的就是把 Mysql的默认字符编码设置为支持中 ...

  10. 依赖注入(DI)和Ninject,Ninject

    我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...