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正则
Jul 07 PHP
phpwind中的数据库操作类
Jan 02 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
VUE安装使用教程详解
2019/06/03 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
JS随机密码生成算法
2019/09/23 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python iter()函数用法实例分析
2018/03/17 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python如何实现异步调用函数执行
2019/07/08 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
澳洲的服装老品牌:SABA
2018/02/06 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
this关键字的含义
2015/04/08 面试题
汽车装潢店创业计划书范文
2014/02/05 职场文书
交通事故代理词范文
2015/05/23 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers