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 相关文章推荐
用PHP来写记数器(详细介绍)
Oct 09 PHP
PHP 数字左侧自动补0
Mar 31 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
PHP chop()函数讲解
Feb 11 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
Yii框架安装简明教程
May 15 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设计模式 Adapter(适配器模式)
2011/06/26 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
php微信开发之谷歌测距
2018/06/14 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
详解Python自建logging模块
2018/01/29 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
药剂专业自荐信范文
2014/04/16 职场文书
HR求职自荐信范文
2014/06/21 职场文书
社区活动策划方案
2014/08/21 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
承诺书范本大全
2015/05/04 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
Python 统计序列中元素的出现频度
2022/04/26 Python