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生成静态HTML速度快类库
Mar 18 PHP
php 文件缓存函数
Oct 08 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 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 字符串操作入门教程
2006/12/06 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
php检测useragent版本示例
2014/03/24 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
JS实现音量控制拖动
2020/01/15 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
浅谈Python中copy()方法的使用
2015/05/21 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
python记录程序运行时间的三种方法
2017/07/14 Python
python3学生名片管理v2.0版
2018/11/29 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python实现数值积分方式
2019/11/20 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
python 深度学习中的4种激活函数
2020/09/18 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
施工班组长岗位职责
2014/01/05 职场文书
大学生活自我评价
2014/04/09 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
早上好问候语大全
2015/11/10 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS