PHP文件上传实例详解!!!


Posted in PHP onJanuary 02, 2007

首先来看下上传部分的表单代码:  

     <form method="post" action="upload.php" enctype="multipart/form-data">   
     <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">   
      <tr>    
        <td width=55 height=20 align="center"><input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD>   
        <td height="16">    
        <input name="file" type="file"  value="浏览" >              
        < input type="submit" value="上传" name="B1">   
        </td>   
      </tr>   
     </table>   
     </form> 
 

这里有几个要注意的地方,首先看这句<form method="post" action="upload.php" enctype="multipart/form-data">,这里我们采用POST方法,个别浏览器还支持PUT方法,当然这需要对脚本进行修改,我并不建议这么做。表单中必须设置enctype="multipart/form-data,这样,服务器就知道上传文件带有常规表单信息,记住,这个是必须设置的。此外还需要一个隐藏域来限制上传文件的最大长度:<input type="hidden" name="MAX_FILE_SIZE" value="2000000">,这里name必须设置成MAX_FILE_SIZE,其值就是上传文件的最大长度,单位是B,这里我限制成2M。再看这句:<input name="file" type="file"  value="浏览" >,type="file"说明了文件类型,这样一个基本的上传文件接口就完成了,接下来讲讲如何用PHP来处理上传的文件,此外你的php.ini中设置的上传文件最大长度可能会影响到你的实际上传,请根据实际情况修改,另PHP的上传是先传到临时目录,在移至指定目录的,了;临时目录的可根据需要修改,也可使用默认值。 
   好的,表单提交upload.php,来看看这个页面都有什么: 
PHP代码如下:  

<?php   
 /*****************************************   
   Title :文件上传详解   
   Author:leehui1983(辉老大)   
   Finish Date  :2006-12-28   
  *****************************************/   
   $uploaddir = "./files/";//设置文件保存目录 注意包含/       
   $type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型    
   $patch="http://127.0.0.1/cr_downloadphp/upload/files/";//程序所在路径      //获取文件后缀名函数   
      function fileext($filename)   
    {   
        return substr(strrchr($filename, '.'), 1);   
    }   
   //生成随机文件名函数       
    function random($length)   
    {   
        $hash = 'CR-';   
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';   
        $max = strlen($chars) - 1;   
        mt_srand((double)microtime() * 1000000);   
            for($i = 0; $i < $length; $i++)   
            {   
                $hash .= $chars[mt_rand(0, $max)];   
            }   
        return $hash;   
    }   
   $a=strtolower(fileext($_FILES['file']['name']));   
   //判断文件类型   
   if(!in_array(strtolower(fileext($_FILES['file']['name'])),$type))   
     {   
        $text=implode(",",$type);   
        echo "您只能上传以下类型文件: ",$text,"<br>";   
     }   
   //生成目标文件的文件名       
   else{   
    $filename=explode(".",$_FILES['file']['name']);   
        do   
        {   
            $filename[0]=random(10); //设置随机数长度   
            $name=implode(".",$filename);   
            //$name1=$name.".Mcncc";   
            $uploadfile=$uploaddir.$name;   
        }   
   while(file_exists($uploadfile));   
        if (move_uploaded_file($_FILES['file']['tmp_name'],$uploadfile)){   
            if(is_uploaded_file($_FILES['file']['tmp_name'])){   
                //输出图片预览   
                echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center><img src='$uploadfile'></center>";   
                echo"<br><center><a href='javascript:history.go(-1)'>继续上传</a></center>";   
              }   
              else{   
                echo "上传失败!";   
              }   
        }   
   }    
?> 
 
刚看这些你可能有点晕~~,不过不要紧,听我讲完,你就会发现其实这玩意SO EASY!!首先我讲下原理,该程序以上传图片为例,先判断文件类型是否为图片格式,若是则上传文件,以随机数和时间的组合重新命名文件(避免上传文件重名,这样做很有必要!),接着上传文件到指定目录,成功上传则输出上传的图片预览。这里要对程序中一些函数作些解释。先看return substr(strrchr($filename, '.'), 1), strrchar()函数有什么作用呢,我举个例子大家就知道,比如一个图片文件 pic.jpg,我们用 strrchr处理,strrchr(pic.jpg,'.'),它将返回.jpg,明白了吗?该函数返回指定字符在该字符串最后出现的位置后的字符。配合 substr() 我们就可以取到jpg,这样我们就得到了文件的后缀名,来判断上传文件是否符合指定格式。本程序把指定的格式放在一个数组中,实际使用时可根据需要添加。 
    接下来看产生随机数文件名部分, 我们看到mt_srand()这个函数,手册上叫他“播下一个更好的随机数发生器种子”,其实就是初始化一个随机数的函数,参数是(double)microtime() * 1000000,这里如果不这是参数就会自动设置个随机数,当然这不符合我们的需要,如此一来,随机数就具备一定的长度,保证了上传文件不重名。接着,我们调用判断文件类型的函数,并将其转化为小写strtolower(fileext($_FILES['file']['name'])),这里有个很关键的东东$_FILES ,这是个超级全局数组,保存了需要处理的表单数据,如果开启了register_globals,也可以直接访问,但这是不安全的。看刚才那个上传接口<input name="file" type="file"  value="浏览" >,根据这个表单名称,我们可以得到很多信息: 
    $_FILES['file']['name']--  得到文件名称 
    $_FILES['file']['tmp_name']--得到临时存储位置 
    $_FILES['file']['size']--得到文件大小 
    $_FILES['file']['type']--得到文件MIME类型 
得到这些信息,我们就可以轻松判断文件的信息了,是不是很方便?^_^,接下来还有一些函数需要了解,file_exists()--判断指定目录是否存在,不存在我们当然不能上传(好像是废话!),move_uploaded_file--将上传文件移至指定目录,is_uploaded_file--判断文件是否已经通过HTTP POST上传。成功上传,我们就输出预览,否则输出上传失败!大功告成 
   大家可根据这个进行扩展,比如配合JS实现多文件上传,如DZ的上传效果,再深一点结合AJAX实现无刷新上传,很多博客都有采用,最后播放下下两篇原创文章的预告 
1  我将把这个例子扩展,增加后台和数据库部分,实现上传文件管理,审核,将发布在原创区。 
2  利用目录函数实现文件管理,将发布在新手区 
希望感兴趣的朋友届时观看~~~,谢谢!!!!!!
PHP 相关文章推荐
4.与数据库的连接
Oct 09 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
Sep 10 PHP
phpnow php探针环境检测代码
Nov 04 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
php版微信发红包接口用法示例
Sep 23 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
php微信公众号开发之秒杀
Oct 20 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
AJAX for PHP简单表数据查询实例
Jan 02 #PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 #PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 #PHP
刚才在简化php的库,结果发现很多东西
Dec 31 #PHP
smarty+adodb+部分自定义类的php开发模式
Dec 31 #PHP
adodb与adodb_lite之比较
Dec 31 #PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 #PHP
You might like
PHP.MVC的模板标签系统(一)
2006/09/05 PHP
一些常用的php函数
2006/12/06 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
php 强制下载文件实现代码
2013/10/28 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
JS 控件事件小结
2012/10/31 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
详解vue路由
2020/08/05 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
网络技术支持面试题
2013/04/22 面试题
美术兴趣小组活动总结
2014/07/07 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
平遥古城导游词
2015/02/03 职场文书
2015年售票员工作总结
2015/04/29 职场文书