当前位置: 首页 > 编程日记 > 正文

Codeigniter文件上传类型不匹配错误

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版本中是否还存在这个问题并没有测试,有遇到的朋友可以分享一下。
参考资料:
1、W3c Mime
2、百科 Mime

相关文章:

【ACM】杭电OJ 2036(待更)

AC代码 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <set> #include <algorithm> using namespace std; const int maxn 105; double a[maxn][3]; int main () {in…

Spring_boot_pom.xml和启动方式

spring-boot-starter-parent 整合第三方常用框架信息(各种依赖信息) spring-boot-starter-web 是Springboot整合SpringMvc Web 实现原理:Maven依赖继承关系 相当于把第三方常用maven依赖信息,在parent项目中已经封装好了 提供依赖信息关联整合的jar包 springboot中快速原理…

ubuntu18安装virtualbox

1. 报错No rule to make target arch/x86/tools/relocs_32.c 解决办法&#xff1a;sudo apt install linux-source sudo apt-get install linux-headers-5.4.0-42:i386 安装步骤&#xff1a; https://blog.csdn.net/AAMahone/article/details/86428040 安装完成后&…

10分钟学会php面相对象基础(Ⅰ)

<?php 声明一个类 class mycar{ etc. //成员方法 } class mycar{ function drive(){ etc. } } ?> 对象的实例化 内存中分栈和堆&#xff0c;栈定长&#xff0c;堆较大不能直接访问。实例化后&#xff0c;实例名称放在栈内&#xff0c;实例放在堆内&#xff0c;通过实例…

【ACM】杭电OJ 2039

先让啊、三边边长a&#xff0c;b&#xff0c;c按从小到大顺序排列&#xff0c;然后再用两边之和大于第三边&#xff0c;两边之差小于第三边来判断 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib&…

AI一周热闻:GitHub免费开放无限私有库;苹果市值蒸发超450亿美元;小米入股TCL...

CES 2019&#xff1a;英伟达发布RTX 2060和RTX 2080移动版小米入股TCL&#xff0c;增强供应链话语权苹果市值蒸发价值超过Facebook&#xff0c;全球市值第一不保GitHub开放无限私有仓库免费使用英特尔和Facebook等发布计算机视觉系统测试新基准旷视创建高性能的“姿态估计”网络…

ubuntu使用相关

ubuntu查看显卡驱动并安装适配的显卡驱动https://blog.csdn.net/qiancaobaicheng/article/details/95096354ubuntu20设置openssl tls versionhttps://www.coder.work/article/7495451

Atitit.提升 升级类库框架后的api代码兼容性设计指南

Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加&#xff0c;版本号在注释上面增加1 2. 废弃api&#xff0c;使用主见dep1 3. 修改api&#xff0c;1 4. 修改依赖import&#xff0c;雅瑶增加文件模式。保持兼容性。。1 5. 优先选择同一个文件内的修改&am…

【ACM】杭电OJ 2040

第一个程序是 15MS #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <set> #include <algorithm> using namespace std; const int maxn 600000; int vis[maxn]; int ma…

阿里云 Aliplayer高级功能介绍(二):缩略图

为什么80%的码农都做不了架构师&#xff1f;>>> 基本介绍 Aliplayer提供了缩略图的功能&#xff0c;让用户在拖动进度条之前知道视频的内容&#xff0c;用户能够得到很好的播放体验&#xff0c;缩略图是显示在Controlbar的上面&#xff0c;并且包含当前的时间&…

【ACM】杭电OJ 2044 2045

一开始全部使用int型&#xff0c;显示WA&#xff0c;百度之后&#xff0c;要全部改成long long 两个题都是死在long long 上 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <s…

POJO、JavaBean、DAO

POJO POJO全称是Plain Ordinary Java Object / Plain Old Java Object&#xff0c;中文可以翻译成&#xff1a;普通Java类&#xff0c;具有一部分getter/setter方法的那种类就可以称作POJO。一般在web应用程序中建立一个数据库的映射对象时&#xff0c;我们只能称它为POJO。 Ja…

jupyter notebook用法积累(快捷键)

打开Anaconda promt&#xff0c;如果想把代打都存在H&#xff1a;\python\py&#xff0c;则输入命令 h: 回车进入h盘&#xff0c;再输入 cd python\py回车就进入这个H&#xff1a;\python\py目录下再输入jupter notebook 回车就打开了浏览器 ctrl回车 可以当前块运行&#xff0…

android资料整理

1. android native内存分析&#xff1a;全民K歌Android端Native内存分析与监控方案实践总结 - 知乎一、背景在2020年的上半年&#xff0c;我们在用户反馈后台发现闪退、白屏问题不断增多&#xff0c;这些问题严重影响用户体验。观察Crash监控平台发现Crash率也在逐步升高,其中N…

Java读取property配置文件

读取配置文件已经成了Java程序员工作的一项必备技能。 配置文件的优点&#xff1a; 可维护性好 怎么个可维护性好呢&#xff1f; 它会让程序中变化的地方很灵活的配置&#xff0c;不需要修改代码。Java程序部署到服务器上去之后就变成了class文件&#xff0c;修改困难&#xf…

【ACM】杭电OJ 2048 2049

两题均是错排公式与阶乘的运用 2048算的是一个比例&#xff0c;2049计算的是一个事情发生的总数 一个用double 来存放数据&#xff0c;一个用long long来存放数据 2048 #include <iostream> #include <cstdio> #include <cstring> #include <cmath&g…

百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口

人机交互经历了三个阶段键鼠、触屏和语音交互。在国外&#xff0c;谷歌、亚马逊、苹果等巨头的竞争已经到达白热化状态&#xff1b;在国内&#xff0c;百度的DuerOS正是这方面的一位大玩家。 在技术发展的各个时代中&#xff0c;提前入局的厂商&#xff0c;必然能够第一时间享…

ptam tracking

并行追踪与制图&#xff08;Parallel Tracking and Mapping&#xff09;简称PTAM&#xff0c;于2007年由英国牛津大学主动视觉实验室的Georg Klein和David Murray提出。PTAM在机器导航&#xff0c;机器探索&#xff0c;人机互动&#xff0c;三维重建等方面都有应用。在这之前已…

【ACM】杭电OJ 2050

直线&#xff1a; 平行线 折线 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; int main () {int n,m;scanf("%d",&n);while…

ASP.NETCore学习记录(一)

ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.NETCore是一个新的开源和跨平台的框架&#xff0c;用于构建如Web应用、物联网&#xff08;IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。ASP.NET …

ptam程序流程

程序运行基本流程&#xff1a;Step1: System::System(){ 1、注册一系列命令、添加相对应的功能按钮。 2、创建摄像机mpCamera new ATANCamera("Camera"); 实现的功能包括&#xff1a;加载camera.cfg配置文件中的摄像机内参&#xff08;mvFocal[0]、mvFocal[1]、mvCe…

js / jquery 零散收集

2019独角兽企业重金招聘Python工程师标准>>> <select id"typeSelector" οnchange"choiceoption(this.options[this.options.selectedIndex])"> <option id"xx" value"a">A</option> </select> &…

【ACM】杭电OJ 2057

思路&#xff1a; 本题注意十六进制的输入输出格式。 注意&#xff1a; 1.别忘了需要用__int64&#xff0c;因为数据比较大&#xff1b; 2.两数相加为负数的时候&#xff0c;想着分开考虑。 #include <iostream> #include <cstdio> #include <cstring> #…

OpenCV学习系列教程第五篇:测试和提高代码的效率

Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档&#xff0c;本人谨做翻译和注释&#xff0c;以及一些自己的理解 本文由作者翻译并进行代码验证&#xff0c;转载请注明出处~ 官方文档请参阅&#xff1a;https://docs.opencv.org/4.0.1/dc/d71/tutorial_py_opt…

ORB-SLAM论文翻译

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 原文发表于&#xff1a;IEEE Transactions on Robotics (Impact Factor: 2.43). 10/2015 摘要&#xff1a; 本文主要讲了ORB-SLAM&#xff0c;一个基于特征识别的单目slam系统&#xff0c;可以实时运行&#xff0…

UVa11300 - Spreading the Wealth

题意 n个人围成一圈&#xff0c;每个人都有一定数量的金币&#xff0c;金币总数可被n整除&#xff0c;现可将手中金币给左右相邻的人&#xff0c;最终使每人手中的金币数相等&#xff0c;求最少转移的金币数量。 思路 设a[i]给了a[i-1]x1个金币&#xff0c;从a[i1]拿到x2个金币…

【ACM】杭电OJ 1862

用了三个快速排序的子函数进行排序&#xff0c;排序结束后&#xff0c;再从头循环&#xff0c;判断成绩或者姓名是否相同。 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <alg…

Custom Client Side Drag and Drop Behavior in ASP.NET AJAX

这是我的一篇在http://aspalliance.com/上的英文文章&#xff0c;限于版权协议中的排他性条款&#xff0c;这里只能给出一部分摘要引用。有兴趣的朋友可以到这里看到完整的全文&#xff1a;《Custom Client Side Drag and Drop Behavior in ASP.NET AJAX》。 Published: 19 Jun…

SLAM的开源以及在移动端AR的适用分析

当前的开源方案 当下部分总结引用自blog:http://blog.csdn.net/OnafioO/article/details/73175835文章总结很好没本文关于其在移动端方面加以总结&#xff0c;希望大家参与讨论&#xff0c;不足之处&#xff0c;请指正。 本讲的前半部分将带领读者参观一下当前的视觉SLAM方案…

用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)

本文适合 Vue 的初学者&#xff0c;以及对 webpack 不熟悉的同学阅读。前提是你要会用基本的命令行、 Node 和 NPM&#xff0c;以及掌握 ES2015 的基础知识。本文都是在 macOS 环境下运行&#xff0c;要求使用 npm > 3, node > 4 的环境。我们会以 Vue 2.0 搭配 Webpack …