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编程中八种常见的文件操作方式
Nov 19 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
apache mysql php 源码编译使用方法
May 03 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
php生成zip文件类实例
Apr 07 PHP
PHP实现的增强性mhash函数
May 27 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
php使用event扩展的io复用测试的示例
Oct 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
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
jquery等待效果示例
2014/05/01 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python 多线程重启方法
2019/02/18 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
简单了解python的break、continue、pass
2019/07/08 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
内刊编辑求职自荐书范文
2014/02/19 职场文书
库房保管员岗位职责
2014/04/07 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
会议欢迎词
2015/01/23 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
余世维讲座观后感
2015/06/11 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android