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-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
php中执行系统命令的方法
Mar 21 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
PHP数组操作类实例
Jul 11 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 PHP
laravel中Redis队列监听中断的分析
Sep 14 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函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
javascript scrollTop正解使用方法
2013/11/14 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
python中的错误处理
2016/04/10 Python
python字典的常用操作方法小结
2016/05/16 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python3进制之间的转换代码实例
2019/08/24 Python
python列表生成器迭代器实例解析
2019/12/19 Python
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
一套VC试题
2015/01/23 面试题
个人职业生涯规划书1500字
2013/12/31 职场文书
小学生暑假生活总结
2015/07/13 职场文书
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby