首页编程PHP典型模块上传与下载模块文章详细

文件尺寸限制及异常处理

原创 2023-09-17 21:57:46 252

在实际的应用中,文件管理功能通常需要对用户上传的文件尺寸和类型做限制,这是上传下载模块的基础功能。对于上传文件尺寸的限制可以在客户端依靠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 524288524 288(512×1024)改大,如改为5M(5×1024×1024),这样上传就不会失败。

推荐