话说 MAX_FILE_SIZE

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

<form enctype="multipart/form-data" action="_URL_" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>

这 里设置MAX_FILE_SIZE = 30000,期待一种可能,使得浏览器在传送文件之前能够依此作出预先判断,如果文件尺寸大于30000字节,则不执行实际的POST动作。也就是不往服务器发送文件内容,而是直接在客户端提醒用户“你试图上传的文件超过30000字节”。

这的确是一个非常棒的主张,但在现实中却暂时无法实现。不是因为这个限制可以“被简单地绕过”,而是IEFireFox这两个主流浏览器都不支持这个特性。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到底是个很小的数值,对大多数上传文件的表单来说没有影响。

btw, PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,然后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。这个Apache的LimitRequestBody选项缺省值=0,允许Request body的最大字节数是2G(Linux + Apache)

时间: 2024-10-10 01:16:48

话说 MAX_FILE_SIZE的相关文章

话说多线程

(十)话说多线程关键字: java 面试题 多线程 thread 线程池 synchronized 死锁作者:臧圩人(zangweiren) 发布时间:2008-08-08网址:http://zangweiren.javaeye.com>>>转载请注明出处!<<<线程或者说多线程,是我们处理多任务的强大工具.线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享:而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同

话说404页面:为什么要设置404页面?

404页面是客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应,且不知道原因.404错误信息通常是在目标页面被更改或移除,或客户端输入页面地址错误后显示的页面. 404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任.404页面通常为用户访问了网站上不存在或已删除的页面,服务器返回的404错误.如果站长没有设置404页面,会出现死链接,蜘蛛爬行这类网址时,不利于搜索引擎收录.设置404有两个好处:1.引导用户不要关闭网站,增强用户体验. 2.防止网站出现死链接. 当用户输

【转】话说C语言const用法

原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量.例:void func(){const int a=0;} 首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0. 然后再看const. const作为一个类型限定词,和int有相同的地位.const int a;int const a;是

话说 依赖注入(DI) or 控制反转(IoC)

首页 下载 扩展 应用 教程 代码 案例 资讯 讨论 全部 搜索 话说 依赖注入(DI) or 控制反转(IoC) 浏览:3641 发布日期:2014/03/20 分类:技术分享 科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描

乔春洋:话说文化圈

乔春洋:话说文化圈       文化圈理论的代表人物是格雷布纳和施米特,下面简要介绍他们的主要观点.       (一)格雷布纳的文化圈理论       费里茨·格雷布纳是德国一位深受新康德主义历史哲学影响的中世纪史学家,他在研究文化传播和发展过程的理论时提出了文化圈理论.他认为:       (1)文化圈是一个分布在一定地理空间内的由若干文化元素或物质组成的文化丛,丛内的各种文化特质均散布于该文化圈的地理空间之中.       (2)文化圈在地理空间的分布上部分重叠,部分分离,而相互重叠的文化

关于android 不同版本号获取wifi SSID,真的没话说了

真的没话说了.......,为何要这样.......,认为好玩吗.......,谷歌那个写这个获取wifiSSID的接口的project师闲的蛋疼. 获取wifiSSID的方法例如以下: android.net.wifi.WifiManager mWifiManager = (WifiManager) MainActivity.this .getSystemService(Context.WIFI_SERVICE); android.net.wifi.WifiInfo mWifiInfo = m

话说C语言const用法

const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰 的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量. 例: void func(){ const int a=0; } 首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量, 我们给它赋予初始值0. 然后再看const. const作为一个类型限定词,和int有相同的地位. const int a; int const a; 是等价的.于是此

L1-021. 重要的话说三遍

L1-021. 重要的话说三遍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了. 注意每遍占一行,除了每行的回车不能有任何多余字符. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 for(int i=0;i<3;

关于开发,第三方服务平台有话说

摘要:在DevStore,我们强调年轻,因为年轻我们一无所有而又应有尽有.原以为跌跌撞撞的前百天,我们走的稳健,真真是一个脚步一个坑.猛回首,不矫情的人也想矫情一把,算了,正能量时代还是要多说点高兴的:百日大庆,活力值大放送哦! 过去的百天,DevStore身子骨一直硬挺,但逐渐长开的五官却愈见灵秀,还有发力前兆的霸气侧漏.熟悉戴维的人肯定都知道活力值的非凡意义,那就是鸡血,能让你一直在DevStore平台上亢奋.云开日现.阳光灿烂.处处贺声一片,老大一高兴就决定英明(当然,不高兴时也比较英明)