【转载】解决Apache2+PHP上传文件大小限制的问题

原文出处:http://evol1216.blog.163.com/blog/static/13019958020106783623528/

在用PHP进行文件上传的操作中,需要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结如下:

1、php.ini:upload_max_filesize
所上传的文件的最大大小。默认值2M。

2、php.ini:memory_limit 本 指令设定
了一个脚本所能够申请到的最大内存字节数,默认值8M。如果不需要任何内存上的限制,必须将其设为 -1。如果内存不够,则可能出现错误:Fatal error:
Allowed memory size of X bytes exhausted (tried to allocate Y
bytes)(一般导入数据库时,如果数据库太大,就会报错,改这个就可以)

3、php.ini:post_max_size
设定POST数据所允许的最大大小。此设定也影响到文件上传。要上传大文件,该值必须大于 upload_max_filesize。

4、php.ini:max_execution_time = 30 ;
Maximum execution time of each script, in seconds

5、php.ini:max_input_time
= 60 ; Maximum amount of time each script may spend parsing request
data

6、如果用到mysql的BLOB进行二进制文件存储,则需要设置my.ini:max_allowed_packet=xxM


7、httpd.conf
   
Apache
里面有一个选项是 LimitRequestBody,
这个选项可以限制用户送出的 HTTP 请求内容。这个选项可以在 .htaccess 或 httpd.conf 里使用,而如果在 httpd.conf
内使用,分别可以用在 virtualhost 或目录属性设定。而 LimitRequestBody 的设定值是介乎 0 (无限制) 至 2147483647
(2GB)。
例如要在目录 D:/AppServ/www
设定上传限制为
100K,可以在 .htaccess 或 httpd.conf 加入以下语句:

  1. LimitRequestBody 1024000000

  2. Options Indexes FollowSymLinks MultiViews ExecCGI

  3. AllowOverride All

  4. Order allow,deny

  5. Allow from all

如果透过 .htaccess 设定,储存档案后会立即生效;如透过 httpd.conf 设定,须要重新启动 Apache。

PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:

  1. <form enctype="multipart/form-data" action="_URL_" method="POST">

  2. <input type="hidden" name="MAX_FILE_SIZE" value="30000">

  3. Send this file: <input name="userfile" type="file">

  4. <input type="submit" value="Send File">

  5. </form>

这里设置MAX_FILE_SIZE =
30000,期待一种可能,使得浏览器在传送文件之前能够依此作出预先判断,如果文件尺寸大于30000字节,则不执行实际的POST动作。也就是不往服
务器发送文件内容,而是直接在客户端提醒用户“你试图上传的文件超过30000字节”。
这的确是一个非常棒的主张,但在现实中却暂时无法实现。不是因为这个限制可以“被简单地绕过”,而是IE和FireFox这两个主流浏览器都不支持这个特性。PHP的这个建议尚未被采纳。


MAX_FILE_SIZE还有一个用场:后台PHP会判断接收到的文件大小是否大于这个值,如果超出,$_FILES[‘thisfile‘]
[‘error‘]会被设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃保存临时文件,将$_FILES[‘thisfile‘]
[‘size‘]置0。
这个例子,没问题,表现正常,当我试图上传一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。

但是,如果我们将表单中的MAX_FILE_SIZE从30000减少到1000,情形又如何呢?

  • 上传800字节的文件,正常;

  • 上传40K的文件,PHP报告文件过大,也正常;

  • 上传3000个字节的文件,PHP未报告错误,它成功保存了文件!出乎意料!

问题就出在main/rfc1867.c中 判断文件是
否超长的这部分代码上。php每次从buffer中读取FILLUNIT字节长度的内容后,首先判断“已经读到的内容长度(total_bytes)”是
否大于MAX_FILE_SIZE,然后再增加“已经读到的内容长度(total_bytes)”。这样一来,和预计的结果之间至多会有FILLUNIT
字节的误差,而FILLUNIT=1024*5=5K。(点击bug了解详细内容)

这就是说,当MAX_FILE_SIZE<5K时,上传一个大于MAX_FILE_SIZE,但是小于5K的文件是没有问题的。

当然,因为这个设置很容易被绕过,所以服务器端编程不应当依赖于MAX_FILE_SIZE。而且,5K到底是个很小的数值,对大多数上传文件的表单来说没有影响。

PHP中post_max_size,upload_max_filesize,
MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。

Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,然后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。

这个Apache的LimitRequestBody选项缺省值=0,允许Request
body的最大字节数是2G(Linux + Apache)

最后还要注意的是:

html本身能够post数据也是有限制的,不能超过2G。

FTP客户端有文件偏移指针的2GB边界限制,未使用特殊编译flag编译的ftp服务器端或者客户端,无论在什么FS中都不支持大于2GB的文件。不知道PHP会不会也有这种情况。

时间: 2024-10-10 12:23:57

【转载】解决Apache2+PHP上传文件大小限制的问题的相关文章

解决ASP.NET上传文件大小限制

第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小. <httpRuntime executionTimeout="800" maxRequestLength="40960"

解决&lt;s:file&gt;上传文件大小和 不能获取文件问题

1.<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.200000762939453px;">表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码.</span> <s:form action="part_add.action"

解决phpmyadmin上传文件大小限制的配置方法

解决phpmyadmin上传文件大小限制的配置方法 phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要phpmyadmin上传超过2M大文件,就需要修改phpmyadmin上传文件的大小配置或者将大文件分几批上传,相对来说修改phpmyadmin上传文件大小的限制来得方便很多.解决phpmyadmin上传文件大小限制问题涉及修改php.ini配置文件和phpmyadmin配置文件. 修改phpmyadmin上传

解决phpmyadmin上传文件大小限制的配置方法(转)

phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要 phpmyadmin上传超过2M大文件,就需要修改phpmyadmin上传文件的大小配置或者将大文件分几批上传,相对来说修改phpmyadmin 上传文件大小的限制来得方便很多.解决phpmyadmin上传文件大小限制问题涉及修改php.ini配置文件和phpmyadmin配置文件. 修改phpmyadmin上传文件大小限制主要分修改php.ini配置文件和p

php和nginx默认上传文件大小限制的解决办法

以下配置在redhat6.4下完成 php上传文件大小限制: 1,首先找到php在用的配置文件 # php –ini 会输出:loaded configureration file:    /usr/loca/php/etc/php.ini 2,编辑php.ini #vim /usr/loca/php/etc/php.ini 3,修改其中的upload_max_filesize 10M  #默认值是2M 保存,退出vim 4,注意:要重启php-fpm,很多人说修改了不生效就是这么回事. #se

修改apache上传文件大小限制

PHP上传文件大小限制解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M    post_max_size = 10M    memory_limit = 20M 把这些值改成我所说的,看看有没有问题,另外要确认上传的 <form> 里没有类似下面的这行 <input type="hidden" name="MAX_FILE_SIZE" value="500000"> 这

js检测上传文件大小

前言: 项目中经常用到需要上传文件.照片等功能,同时需要限制所上传文件的大小.很多插件都会采用后台请求验证,前端Js校验比较少.本篇介绍一个前端JS便捷判断上传文件大小的方法. 代码很简单,关键就是怎么用JS拿到文件然后获取文件大小,进而去判断拦截.由于各种历史原因,IE的ActiveX控件因素,获取文件的方法可能和其他浏览器有所不同,所以只需稍加判断即可. JS代码: <script type="text/javascript"> // 判断是否为IE浏览器: /msie

[转]通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题

转:http://blog.csdn.net/zhengwish/article/details/51602059 通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题: 用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,否则会中断在nginx的请求中,在php中是无法记录到访问的. 一般上传大文件流程: 首先修改php.ini文件: 参数 设置 说明 file_uploads on 是

【荐】PHP上传文件大小限制大全

在php.ini里面可以设置最大上传文件大小 解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M post_max_size = 10M memory_limit = 20M 另外要确认上传的 <form> 里类似下面的这行 <input type="hidden" name="MAX_FILE_SIZE" value="500000"> 第二: 如果是apache 2