配置php.ini实现PHP文件上传功能


Posted in PHP onNovember 27, 2014

昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置。

说到在php.ini中的文件上传的配置,其实在之前介绍PHP文件上传功能代码实例教程以及Jquery AjaxUpload实现文件上传功能代码实例教程时我都有所提及。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项。

php.ini中文件上传功能配置选项说明

打开php.ini配置文件找到File Uploads

file_uploads = On

默认允许HTTP文件上传,此选项不能设置为OFF。

upload_tmp_dir =

默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就无法实现,这个选项设置的是文件上传时存放文件的临时目录,你必须给这个选项赋值,比如upload_tmp_dir ='/leapsoulcn',代表在C盘目录下有一个leapsoulcn目录,和session配置一样,如果你是在linux环境下,你必须赋予这个目录可写权限。

如何上传超过8M的大文件?

上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项。

php.ini配置文件中的默认文件上传大小为2M,php初学者容易犯的一个错误是在编写文件上传功能时通过设置上传文件最大大小的表单区域,即允许上传文件的最大值,max_file_size(隐藏值域)的值来规定上传文件的大小,其实一般别人可以绕过这个值,所以安全起见,最好是在php.ini配置文件中配置upload_max_filesize选项,设定文件上传的大小。

默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max_filesize = 20M。

但是光设置upload_max_filesize = 20M还是无法实现大文件的上传功能,你必须修改php.ini配置文件中的post_max_size选项,其代表允许POST的数据最大字节长度,默认为8M。如果POST数据超出限制,那么$_POST和$_FILES将会为空。要上传大文件,你必须设定该选项值大于upload_max_filesize指令的值,我一般设定upload_max_filesize和post_max_size值相等。另外如果启用了内存限制,那么该值应当小于memory_limit选项的值。

文件上传的其他注意事项

在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。

至此,在php.ini配置文件中对文件上传选项进行配置的PHP教程就介绍完毕了,通过上面的步骤实践与学习,再结合PHP程序,文件上传功能就可以实现了。

下面是一些补充:

本文介绍了如何配置php.ini实现PHP文件上传功能。其中涉及到php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,这些选项是文件上传成败的关键。我们以php.5.3.5的Windows版本为例说明。

php.ini中文件上传功能配置选项说明
用文本工具(推荐EditPlus)打开php.ini 配置文件,查找 File Uploads ,在这个区域有以下3个选项:

file_uploads = On

是否允许HTTP文件上传。默认值为On允许HTTP文件上传,此选项不能设置为Off。

upload_tmp_dir =

文件上传的临时存放目录。如果没指定则PHP会使用系统默认的临时目录。该选项默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就无法实现,你必须给这个选项赋值,比如upload_tmp_dir = "d:/fileuploadtmp" ,代表在D盘目录下有一个fileuploadtmp目录,并且给这目录读写权限。

upload_max_filesize = 2M

上传文件的最大尺寸。这个选项默认值为2M,即文件上传的大小为2M,如果你想上传一个50M的文件,你必须设定 upload_max_filesize = 50M。
但是仅设置upload_max_filesize = 50M 还是无法实现大文件的上传功能,我们还必须修改php.ini文件中的 post_max_size 选项。

继续在 php.ini 中查找 Data Handling ,在这个区域有1个选项:

post_max_size = 8M

指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M。如果POST数据超出限制,那么$_POST和$_FILES将会为空。
要上传大文件,你必须设定该选项值大于upload_max_filesize选项的值,例如你设置了upload_max_filesize = 50M ,这里可以把post_max_size = 100M。
另外如果启用了内存限制,那么该值应当小于memory_limit 选项的值。

继续在 php.ini 中查找 Resource Limits ,在这个区域有3个选项:

max_execution_time = 30

每个PHP页面运行的最大时间值(单位秒),默认30秒。当我们上传一个较大的文件,例如50M的文件,很可能要几分钟才能上传完,但php默认页面最久执行时间为30秒,超过30秒,该脚本就停止执行,这就导致出现无法打开网页的情况。因此我们可以把值设置的较大些,如 max_execution_time = 600。 如果设置为0,则表示无时间限制。

max_input_time = 60

每个PHP脚本解析请求数据所用的时间(单位秒),默认60秒。当我们上传大文件时,可以将这个值设置的较大些。 如果设置为0,则表示无时间限制。

memory_limit = 128M

这个选项用来设置单个PHP脚本所能申请到的最大内存空间。这有助于防止写得不好的脚本消耗光服务器上的可用内存。如果不需要任何内存上的限制将其设为 -1。
php5.2.0以前的版本默认8M; php.5.2.0版本默认为16M。php 5.2.0之后的版本默认为 128M;

php.ini 配置上传文件功能示例
假设要上传一个50M的大文件。配置 php.ini 如下:
file_uploads = On
upload_tmp_dir = "d:/fileuploadtmp"
upload_max_filesize = 50M
post_max_size = 100M
max_execution_time = 600
max_input_time = 600
memory_limit = 128M

提示:需要保持 memory_limit > post_max_size > upload_max_filesize

此例仅供参考,你可以根据实际情况调整。
 

PHP 相关文章推荐
php实现mysql数据库备份类
Mar 20 PHP
php中在PDO中使用事务(Transaction)
May 14 PHP
基于php-fpm 参数的深入理解
Jun 03 PHP
php ios推送(代码)
Jul 01 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
PHP内置的Math函数效率测试
Dec 01 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 PHP
php程序员应具有的7种能力小结
Nov 27 #PHP
分享最受欢迎的5款PHP框架
Nov 27 #PHP
PHP比你想象的好得多
Nov 27 #PHP
简单说说PHP优化那些事(经验分享)
Nov 27 #PHP
几个实用的PHP内置函数使用指南
Nov 27 #PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 #PHP
浅谈php优化需要注意的地方
Nov 27 #PHP
You might like
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python编程嵌套函数实例代码
2018/02/11 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python实现简单日期工具类
2019/04/24 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
荒岛余生观后感
2015/06/09 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript