原文出处: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会不会也有这种情况。

转载于:https://www.cnblogs.com/datastack/p/3776863.html

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

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

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

  2. 解决angularjs判断上传文件大小

    为什么80%的码农都做不了架构师?>>>    在input控件中加入如下的代码 οnchange="angular.element(this).scope().viewI ...

  3. 解决linux服务器上传文件大小的限制

    有时候,我们需要从客户机向服务器传输一些文件,但是由于DBA在上传文件的安全配置上做了一些限制,导致我们上传的单个文件不能超过固定大小.也就导致我们无法传送大对象文件和大的压缩文件. 例如,我们使用S ...

  4. 帝国没有php.ini,帝国cms上传文件大小的限制php.ini设置方法

    本文将为您介绍的是解决帝国cms上传文件大小的限制php.ini设置方法,具体操作方法请看下文: 1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完. 但在php中, ...

  5. PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法

    PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法 参考文章: (1)PHP上传文件大小限制问题 post_max_size对大小的影响及解决方法 (2)https://ww ...

  6. 修改Nginx与Apache配置参数解决http状态码:413上传文件大小限制问题

    一.修改Nginx上传文件大小限制 我们使用ngnix做web server的时候,nginx对上传文件的大小有限制,默认是1M. 当超过大小的时候会报413(too large)错误.这个时候我们要 ...

  7. IIS7.X上传文件大小受限制解决方法

    IIS7.X上传文件大小受限制解决方法 参考文章: (1)IIS7.X上传文件大小受限制解决方法 (2)https://www.cnblogs.com/jroger/articles/2590433. ...

  8. WordPress解决上传文件大小限制问题

    WordPress解决上传文件大小限制问题 参考文章: (1)WordPress解决上传文件大小限制问题 (2)https://www.cnblogs.com/wangyi0419/p/1231376 ...

  9. SpringBoot上传文件大小限制

    SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSize ...

最新文章

  1. linux 内存泄露工具,linux下检查内存泄露的工具--mtrace
  2. python redis事务_python redis事务源码及应用分析
  3. Linux和unix中 awk 的print浅谈
  4. SpringMVC的表单标签库
  5. 通过Servlet的response绘制页面验证码
  6. Impala之加载HBase数据
  7. pytorch1.7.0 安装亲测有效
  8. java 两个数据合并_R:两个数据帧合并
  9. HDU2008 数值统计【入门】
  10. 20145122《Android开发基础》实验四实验报告
  11. 简述L4无人驾驶的发展
  12. springboot之@Async实现异步
  13. VLOOKUP函数返回查询值左侧的数据
  14. UVA 202 - Repeating Decimals(模拟)
  15. Caused by: org.dom4j.DocumentException异常信息记录
  16. Activity简单几步支持向右滑动返回
  17. 【软件测试】如何梳理你测试的业务
  18. winRAR压缩、解压不常见的文件格式
  19. SVN设置忽略文件夹
  20. hbuilder能用python_hbuilder之开发Python。

热门文章

  1. mysql数据库语法_MySQL数据库基本语法
  2. mysql innodbmaxdirtypagespct_MySQL参数解析innodb_max_dirty_pages_pct
  3. 五分钟没有操作自动退出_这又是什么骚操作??5只蚂蚁战略配售基金拟增设B类份额,自动赎回退出!!...
  4. php 7 显示错误信息,PHP 7 错误处理
  5. datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
  6. android window 大小,android popupWindow 中宽度莫名很大,求帮助?
  7. linux表示逻辑分区的标号,在Linux系统的设备文件中,代表第2个SCSI硬盘的第1个逻辑分区的设备文件是()。...
  8. Java面试之Java基础下册(含答案)
  9. 站在巨人的肩膀上,Adrian与dlib中face_recongnition模块的贡献者Adam的采访部分翻译
  10. Linux那些事儿之我是Sysfs(5)举例二sculld