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 相关文章推荐
MVC模式的PHP实现
Oct 09 PHP
模仿OSO的论坛(四)
Oct 09 PHP
php json_encode奇怪问题说明
Sep 27 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php异步多线程swoole用法实例
Nov 14 PHP
PHP魔术方法的使用示例
Jun 23 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
Thinkphp实现自动验证和自动完成
Dec 19 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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
第八节--访问方式
2006/11/16 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
javascript实现的listview效果
2007/04/28 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
canvas绘制多边形
2017/02/24 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python re模块的高级用法详解
2018/06/06 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python实现最小二乘法线性拟合
2019/07/19 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
年会搞笑主持词串词
2014/03/24 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
英文演讲稿
2014/05/15 职场文书
三严三实心得体会范文
2014/10/13 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL