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下实现农历日历的代码
Mar 07 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
PHP新手NOTICE错误常见解决方法
Dec 07 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
php图片添加水印例子
Jul 20 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
js轮播图代码分享
2016/07/14 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
Python常用模块介绍
2014/11/21 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python3中str(字符串)的使用教程
2017/03/23 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
Python切图九宫格的实现方法
2019/10/10 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
最新的互联网创业计划书
2014/01/10 职场文书
计算机专业求职信
2014/06/02 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
亮剑观后感
2015/06/05 职场文书
热爱劳动主题班会
2015/08/14 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python