PHP中,文件上传


Posted in PHP onDecember 06, 2006

在PHP中,文件上传一般是通过move_uploaded_file()来实现的。 
bool move_uploaded_file ( string filename, string destination )本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。  

如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE。  

如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。 

下面我们通过一个实例来说明PHP是如何实现文件上传的。 
test.php 的原文件 

<html>   
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">   
<title>网站文件上传实例</title>   
<!--   
-->   
</head>   
<body>   
<form enctype="multipart/form-data" action=action.php method=post>    
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">   
<input type=file name=upfile size=20>   
<input type=submit value='上传文件'>    
</form>    
</body>   
</html>  

MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。实际上,PHP 设置中的上传文件最大值是不会失效的。但是最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。 

注: 要确保文件上传表单的属性是 enctype="multipart/form-data",否则文件将无法上传。 

在处理上传页面中,上传文件的信息是通过数组 $_FILES 来获取的。我们假设文件上传字段的名称如上例所示,为 "upfile",则文件信息为: 

$_FILES['upfile']['name'] 

上传文件的原文件名。 

$_FILES['upfile']['type'] 

文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。 

$_FILES['upfile']['size'] 

上传文件的大小,单位为字节。 

$_FILES['upfile']['tmp_name'] 

文件上传后在服务端储存的临时文件名。 

$_FILES['upfile']['error'] 

和该文件上传相关的错误代码。 

PHP 将随文件信息数组一起返回一个对应的错误代码。该代码可以在文件上传时生成的文件数组中的 error 字段中被找到。代码如下: 

UPLOAD_ERR_OK 

其值为 0,文件上传成功。  

UPLOAD_ERR_INI_SIZE 

其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值 ,默认值为2M。 如果要想上传更大的,我们可以在php.ini里查找 upload_max_filesize = 2M 修改后即可生效。 

UPLOAD_ERR_FORM_SIZE 

其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 

UPLOAD_ERR_PARTIAL 

其值为 3,文件上传不完全,只有部分被上传。  

UPLOAD_ERR_NO_FILE 

其值为 4,文件上传失败。 

UPLOAD_ERR_NO_TMP_DIR 

其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。 

UPLOAD_ERR_CANT_WRITE 

其值为 7,文件写入失败。PHP 5.1.0 引进。 

注: 以上值在 PHP 4.3.0 之后变成了 PHP 常量。 
action.php 的原代码 
<? 
/** 
欢迎光临我们来我站交流学习经验  

*/ 

function getname($exname){ 
   $dir = "tmp/"; 
   $i=1; 
   if(!is_dir($dir)){ 
      mkdir($dir,0777); 
   } 

   while(true){ 
     if(!is_file($dir.$i.".".$exname)){ 
        $name=$i.".".$exname; 
        break; 
      } 
     $i++; 
   } 

   return $dir.$name; 

$exname=strtolower(substr($_FILES['upfile']['name'],(strrpos($_FILES['upfile']['name'],'.')+1))); 
$uploadfile = getname($exname);  

if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile)) { 
   echo "<h2><font color=#ff0000>文件上传成功!</font></h2><br><br>"; 
}else { 
   echo "<h2><font color=#ff0000>文件上传失败!</font></h2><br><br>"; 

echo "下面是文件上传的一些信息: 
    <br><br>原文件名:".$_FILES['upfile']['name'] . 
    "<br><br>类型:" .$_FILES['upfile']['type'] . 
    "<br><br>临时文件名:".$_FILES['upfile']['tmp_name']. 
    "<br><br>文件大小:".$_FILES['upfile']['size'] . 
    "<br><br>错误代码:".$_FILES['upfile']['error']; 
?>  

一定要确保上传后文件所在的文件夹的权限至为 777 ,这点在服务器上体现的特别明显,有时我们编写的上传代码没有任何的错误,然而在网上却无法实现上传功能,原因就在这里。 

本文只是讲了如何通过PHP来实现文件上传的,没看过这部分的朋友可以参考一下。

PHP 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
PHP与C#分别格式化文件大小的代码
May 14 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP simplexml_load_file()函数讲解
Feb 03 PHP
PHP filesize函数用法浅析
Feb 15 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 #PHP
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 #PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 #PHP
PHP产生随机字符串函数
Dec 06 #PHP
如何使用PHP往windows中添加用户
Dec 06 #PHP
php巧获服务器端信息
Dec 06 #PHP
Apache2 httpd.conf 中文版
Dec 06 #PHP
You might like
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python爬取51job中hr的邮箱
2016/05/14 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Django框架封装外部函数示例
2019/05/28 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
利用python实现AR教程
2019/11/20 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
django rest framework使用django-filter用法
2020/07/15 Python
python3.7调试的实例方法
2020/07/21 Python
python中return不返回值的问题解析
2020/07/22 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
《梅兰芳学艺》教学反思
2014/02/24 职场文书
中式婚礼主持词
2014/03/13 职场文书
师德师风学习材料
2014/12/19 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书