Mar
17

PHP5文件上传     2009

 11:52    926    0   noel 程序 代码 源码 不指定 | |
PHP5文件上传
    上传文件的表单(form)提交方式(method)采用POST方式,另外还要加上这两个属性:enctype='multipart/form-data' 和页面值处理地址action
    注:
    A、enctype 用于Sets or retrieves the MIME encoding for the form(设置或获取表单的MIME编码)
    MIME的英文全称是"Multipurpose Internet Email Extension" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将 MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。
    B、'multipart/form-data' 值千万不要写错了。否则会出现意想不到的错误。

    例:
    upfile.php代码如下:
    <html>
    <head></head>
    <body>
        <form method='post' enctype='multipart/form-data' action='upfiledeal.php'>
            <input type='hidden' name='MAX_FILE_SIZE' value='8388608'>
            upload this file:<input type='file' name='userfile'>
            <input type='submit' value='upload file'>
        </form>
    </body>
</html>

一般要加上隐藏域:
<input type=hidden name='MAX_FILE_SIZE' value=”8388608”>,位置在file域前面。value的值是上传文件的客户端字节限制(本例取的是8M 8×1024×1024)。如果上传文件大于此值,将会报“上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值”的错误。
注:MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。实际上,PHP.ini 设置中的上传文件最大值,是不会失效的。但是最好还是在表单中加上 MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。


2、全局变量 $_FILES[‘varname’]
    php5新创的全局变量来接收文件的上传,varname与form表单中file域的name值对应。
预定义变量$_FILES数组有5个内容:
     $_FILES['userfile']['name']——客户端机器文件的原名称
     $_FILES['userfile']['type']——文件的 MIME 类型
     $_FILES['userfile']['size']——已上传文件的大小,单位为字节
     $_FILES['userfile']['tmp_name']——文件被上传后在服务端储存的临时文件名
     $_FILES['userfile']['error']——和该文件上传相关的错误代码
其中$_FILES['userfile']['error']的可以有下列取值和意义:
     0——没有错误发生,文件上传成功。
     1——上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
     2——上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
     3——文件只有部分被上传。
     4——没有文件被上传。
3、上传文件大小限制
     限制上传文件大小的因素有
     A,客户端限制:隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
     B,服务器端限制:upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置,也可以在php.ini里设置,
    file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开
    upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
    upload_max_filesize = 8388608 ;望文生意,即允许上传文件大小的最大值。
    Data Handling ;区域,
    还有一项:post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
一般地,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题。
     C,自定义限制。
        上传大于8M文件如何设置php.ini;
        如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得关心关心下面的参数:

Resource Limits
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了。
好了,设置好现在就可以一试。

4、上传文件格式检验
     1、检验文件格式的方法应该很多,可以检测MIME类型,也可以用正则表达式判断,这里推
     荐一种我常用的:
         //自定义允许的文件上传格式;
         $upload_type=".jpeg,.png,.gif,.rar,.zip,.chm,.html,.htm";
         //检验上传文件是否符合格式的函数。
         function check_type($upload_type)
        {
             $file_name=$_FILES['$form']['name'];
             $findtype=strtolower(strrchr($file_name,"."));
             $allow=strpos($upload_type,$findtype);
             if($allow===false)
            {
                 echo"文件格式不符";
                 exit;
             }

         }

     2、   关于通过$_FILES['userfile']['type']——文件MIME类型来检查上传格式
    倘若我们要上传ZIP和RAR的文件,你可以在接收文件的php中写上:
       $filetype=$_FILES['userfile']['type'];
      echo"$filetype";
      就可看到上传文件的mime类型.
      ZIP的MIME类型用application/x-zip-compressed
      RAR的MIME类型用application/octet-stream

    然后再用如下代码判断格式:

switch ($_FILES['userfile']['type'])
{
case "application/x-zip-compressed":
break;
case "application/octet-stream":
break;
case "text/plain":
break;
default:
print "您上传的文件类型不对";
exit(0);
break;
}

5、开始上传文件
upfiledeal.php

<?php
// 在 4.1.0 以前的 PHP 中,需要用 $HTTP_POST_FILES 代替 $_FILES。
// 在 4.0.3 以前的 PHP 中,需要用 copy()来代替 move_uploaded_file()。
if($_FILES['userfile']['error']>0)
{
    echo"上传失败:";
    switch($_FILES['userfile']['error'])
    {//文件上传错误代码,具体原因参照本文第5条;
    case 1: echo"上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";break;
    case 2: echo"上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";break;
    case 3: echo"文件只有部分被上传";break;
    case 4: echo"没有文件被上传";break;
    }

}
$uploaddir        = '../uploads/';
/*
记得在httpd.conf所指定的DocumentRoot目录外新建一个uploads文件夹,
将之用来保存上传的文件。之所以要把upfile放在DocumentRoot目录外,是为了
防止客户端上传一些别有用心的PHP代码来破坏站点,因为在DocumentRoot目录外的
PHP代码是无法执行的。
*/
$uploadfile        = $uploaddir . basename($_FILES['userfile']['name']);
if(is_uploaded_file($_FILES['userfile']['tmp_name']))
{
    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
    {
        echo 'successfully uploaded!';
        echo "<a href='http://localhost/".$uploadfile."'>".basename($_FILES['userfile']['name'])."</a>";
    }
    else
    {
        echo "error\n";
    }
}
//print_r($_FILES);
?>
注:is_uploaded_file() 该函数用来判断文件到底是客户端上传的呢还是本机原有的
       move_uploaded_file() 把客户端上传的文件从临时文件里移走
       string basename ( string path [, string suffix] )

给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。如果文件名是以 suffix 结束的,那这一部分也会被去掉。


//如果是图片也一样,只不过uploads文件夹要建在DocumentRoot指定目录的下面。
同时改动$uploaddir        = 'uploads/';
加上下面的语句就可以将上传的图片显示出来:
echo '<img width=400 height=300 src="'.$uploadfile.'">';

//文件下载
同时改动$uploaddir        = 'uploads/';
加上下面的语句就可以下载:
echo "<a href='http://localhost/".$uploadfile."'>".basename($_FILES['userfile']['name'])."</a>";

作者:noel@淘宝网女装新款秋装连衣裙裤子外套上衣_2012时尚女装新款 Ecmall二次开发-PHP技术
地址:http://www.laohucheng.com/post/133/
版权所有©转载时必须以链接形式注明作者和原始出处及本声明!

Tags: 引用(0)
发表评论
昵称 [注册]
密码 游客无需密码
网址
电邮
打开HTML 打开UBB 打开表情 隐藏 记住我