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. [SharePoint 2010] Modify lookup mapping with PowerShell

    SharePoint支持将列表保存成列表模板,但当列表包含Lookup字段时,通过模板创建的列表会丢失Lookup字段的信息. 通过PowerShell,可以修改Lookup字段的xml内容. Fun ...

  2. sql中datetime 和 timestamp

    datetime 1.允许为空值,可以自定义值,系统不会自动修改其值. 2.不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据. 3.虽然不可以设定默 ...

  3. c#字符显示转换{0:d}

    C#:String.Format数字格式化输出 : int a = 12345678; //格式为sring输出// Label1.Text = string.Format("asdfads ...

  4. jquery 通过ajax FormData 对象上传附件

    之前上传附件都是用插件,或者用form表单体检(这个是很久以前的方式了),今天突发奇想,自己来实现附件上传,具体实现如下 html: <div>   流程图: <input id=& ...

  5. DEV皮肤颜色获取

    Skin GridSkin = GridSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel); evenColor = GridSkin[G ...

  6. JSON.stringify()

    概述 JSON.stringify() 方法可以将任意的 JavaScript 值序列化成 JSON 字符串. 语法 JSON.stringify(value[, replacer [, space] ...

  7. RevMan简单入门指南

    要画个Forest plot啥的,参考 RevMan软件使用 http://wenku.baidu.com/link?url=VY8pCL81K_34xZuW1Z516PrtOVrAbMt8wkIIp ...

  8. 用实例讲解RSA加密算法(精)

    RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经 ...

  9. 乐1S 5.8(Android 6.0) 刷第三方recovery并刷入root权限

    说明 我的是 乐视1S, 系统为EUI 5.8 (powered by Android 6.0) 使用的是 superSu来root, 你可以到这里下载 文件 *下载 Recovery Flashab ...

  10. java 线程返回值

    1.传统方式需要新建一个接口类,然后在接口类中将结果在方法中作为参数进行处理 package de.bvb.test3; public class Test3 { public static void ...