在实际的应用中,文件管理功能通常需要对用户上传的文件尺寸和类型做限制,这是上传下载模块的基础功能。对于上传文件尺寸的限制可以在客户端依靠JavaScript程序来实现,但同时也需要对WebServer的配置做必要的修改,下面分别介绍这两种方式。
7.2.1 JavaScript文件尺寸验证
打开前面创建的文件上传界面文件upload.html,添加文件尺寸判断函数。修改后的页面代码如下:
<html xmlns="undefined"> <head> <title>文件上传页面</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="description" content="文件上传页面" /> <script language="javascript" type="text/javascript"> function getFileSize(filename) { // var filename = document.all('fileup').value; //获得上传文件的物理路径 if(filename =='') { alert("你还没有浏览要上传的文件"); return false; } try { var fso,f,fname,fsize; var flength=1024; //设置上传的文件最大值(单位:kb),超过此值则不上传。 var fso=new ActiveXObject("Scripting.FileSystemObject"); f=fso.GetFile(filename);//文件的物理路径 fname=fso.GetFileName(filename);//文件名(包括扩展名) fsize=f.Size; //文件大小(bit) fsize=fsize/1024; if(fsize>flength){ alert("上传的文件到小为:"+fsize+"kb,\n超过最大限度"+flength+"kb,不允许上传 "); return false; }else{ alert("允许上传,文件大小为:"+fsize+"kb"); } } catch(e) { alert(e+"\n 跳出此消息框,是由于你的activex控件没有设置好,\n"+ "你可以在浏览器菜单栏上依次选择\n"+ "工具->internet选项->\"安全\"选项卡->自定义级别,\n"+ "打开\"安全设置\"对话框,把\"对没有标记为安全的\n"+ "ActiveX控件进行初始化和脚本运行\",改为\"启动\"即可"); return false; } return true; } </script> </head> <body bgcolor="#FFFFFF"> <center> <form enctype="multipart/form-data" action="upload.php" method="post"> <table border="1" width="55%" id="table1" cellspacing=0> <tr> <td colspan="2"> <p align="center">上传文件: </td> </tr> <tr> <td width="10%"> </td> <td width="71%"> <input type="hidden" name="max_file_size" value="100000"> <input name="userfile" type="file"> <input type="submit" value="上传文件" onClick="getFileSize(document.all('userfile').value)"> </td> </tr> </table> 允许上传的文件类型为:jpg|jpeg|gif|bmp|png|swf|mp3|wma|zip|rar|doc </form> </center> </body> </html>
使用上面的程序上传一个大尺寸的文件,通过测试程序是否正确来判断文件尺寸。上传后浏览器弹出提示文件尺寸过大的信息,验证文件尺寸的检测有效。
注意:上面的代码做文件尺寸检测是依赖于ActiveXObject("Scripting.FileSystemObject");这个是IE控件完成的,一些情况下需要降低IE的安全级别才能正常运行。
7.2.2 PHP 上传文件涉及的参数
PHP默认的文件上传尺寸限制最大是2M,如果需要上传超过该尺寸大小的文件,需要调整PHP的配置文件中的部分参数。下面介绍PHP文件上传中涉及需要调节的参数及含义。
file_uploads:是否允许通过HTTP上传文件的开关,默认为ON,即开通。
upload_tmp_dir:用来指明PHP上传文件放置的临时目录,待上传的文件需要保证服务器没有关闭临时文件并对文件夹有“写”权限,如果未指定则PHP使用系统默认值。
upload_max_filesize:允许上传文件大小的最大值,默认为2M。
post_max_size:设置在POST方法中,进行一次表单提交中PHP所能够接收的最大数据量。如果希望使用PHP 文件上传功能,则需要将此值改为比upload_max_filesize数值大。
max_input_time:以秒为单位对通过POST、GET及PUT方式接收数据的时间进行限制。如果应用程序所运行环境处在低速链路上,则需要增加此值以适应接收数据所需的更多时间。
memory_limit:为了避免正在运行的脚本大量使用系统可用内存(PHP允许定义内存使用限额)。通过memory_limit变量指定单个脚本程序可以使用的最大内存容量变量memory_limit的值应当适当大于post _max_size的值。
max_execution_time:设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态时此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(如上传大尺寸文件)这项功能也会导致操作失败。在这样的情况下,必须考虑将此变量值增加,以避免PHP在脚本正在执行某些重要过程的时候将脚本关闭。
了解各项参数的含义后开始调节相关项目的参数,打开php.ini,需要修改如下几处。
file_uploads =on:是否允许通过HTTP上传文件的开关,默认为ON,即开。
upload_tmp_dir:文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件。
upload_max_filesize=8m:允许上传文件大小的最大值,默认为2M。
post_max_size=8m:指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值,默认为8M。
设置好上述4个参数后,可以上传尺寸小于8M的文件。如果需要上传尺寸更大的文件,则需要进一步配置以下参数。
max_execution_time= 600:每个PHP 页面运行的最大时间值(秒),默认为30秒。
max_input_time=600:每个PHP页面接收数据所需的最大时间,默认为60秒。
memory_limit=8m:每个PHP页面所占用的最大内存值,默认为8MB。
对于Linux主机,还需要调整 php.conf文件中的 LimitRequestBody 524288将524 288(512×1024)改大,如改为5M(5×1024×1024),这样上传就不会失败。