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 中的str_replace 函数总结
Apr 27 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
php语言流程控制中的主动与被动
Nov 05 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 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利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
详解Python的三种拷贝方式
2020/02/11 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
劳资员岗位职责
2013/11/11 职场文书
财务分析个人的自荐书范文
2013/11/24 职场文书
安全大检查反思材料
2014/01/31 职场文书
逃课上网检讨书
2014/02/20 职场文书
师德师风自查总结
2014/10/14 职场文书
《假如》教学反思
2016/02/17 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL