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 相关文章推荐
php批量删除数据
Jan 18 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
php标签云的实现代码
Oct 10 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 PHP
php提取字符串中网站url地址的方法
Dec 03 PHP
discuz目录文件资料汇总
Dec 30 PHP
php简单日历函数
Oct 28 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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&amp;mysql(五)
2006/10/09 PHP
我的论坛源代码(五)
2006/10/09 PHP
php页面缓存方法小结
2015/01/10 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
jquery中radio checked问题
2015/03/16 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
中专毕业生求职简历的自我评价
2013/10/21 职场文书
最热门的自我评价
2013/12/30 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
开幕式邀请函
2015/01/31 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
一条慢SQL语句引发的改造之路
2022/03/16 MySQL