PHP 图片文件上传实现代码


Posted in PHP onDecember 29, 2010

为了网站的安全,肯定不让上传php文件,如果有人进入你的后台,上传了一个php文件,你的网站源码,全部救变成他的了,直接打包看你的代码。所以一定要控制上传的目录与文件类型,一般只可以上传图片。

创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:

<html> 
<body> 
<form action="upload_file.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 
</body> 
</html>

请留意如下有关此表单的信息:
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:
<?php 
if ($_FILES["file"]["error"] > 0) 
{ 
echo "Error: " . $_FILES["file"]["error"] . "<br />"; 
} 
else 
{ 
echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; 
echo "Stored in: " . $_FILES["file"]["tmp_name"]; 
} 
?>

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
$_FILES["file"]["name"] - 被上传文件的名称 
$_FILES["file"]["type"] - 被上传文件的类型 
$_FILES["file"]["size"] - 被上传文件的大小,以字节计 
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称 
$_FILES["file"]["error"] - 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:
<?php 
if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 
&& ($_FILES["file"]["size"] < 20000)) 
{ 
if ($_FILES["file"]["error"] > 0) 
{ 
echo "Error: " . $_FILES["file"]["error"] . "<br />"; 
} 
else 
{ 
echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; 
echo "Stored in: " . $_FILES["file"]["tmp_name"]; 
} 
} 
else 
{ 
echo "Invalid file"; 
} 
?>

注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。
保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php 
if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg")) 
&& ($_FILES["file"]["size"] < 20000)) 
{ 
if ($_FILES["file"]["error"] > 0) 
{ 
echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
} 
else 
{ 
echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; 
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 
if (file_exists("upload/" . $_FILES["file"]["name"])) 
{ 
echo $_FILES["file"]["name"] . " already exists. "; 
} 
else 
{ 
move_uploaded_file($_FILES["file"]["tmp_name"], 
"upload/" . $_FILES["file"]["name"]); 
echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
} 
} 
} 
else 
{ 
echo "Invalid file"; 
} 
?>

上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。
注释:这个例子把文件保存到了名为 "upload" 的新文件夹。
PHP 相关文章推荐
提升PHP执行速度全攻略
Oct 09 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
sql注入与转义的php函数代码
Jun 17 PHP
php银联网页支付实现方法
Mar 04 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP简单实现正则匹配省市区的方法
Apr 13 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 #PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 #PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 #PHP
php输出表格的实现代码(修正版)
Dec 29 #PHP
纯php打造的tab选项卡效果代码(不用js)
Dec 29 #PHP
PHP的autoload自动加载机制使用说明
Dec 28 #PHP
php的ajax框架xajax入门与试用介绍
Dec 19 #PHP
You might like
深入分析php中接口与抽象类的区别
2013/06/08 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
浅谈node的事件机制
2017/10/09 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现月食效果实例代码
2019/06/18 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
Python 使用多属性来进行排序
2019/09/01 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
在校实习生求职信
2014/06/18 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
2014年调度员工作总结
2014/11/19 职场文书
西安兵马俑导游词
2015/02/02 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书