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读取PDF内容配合Xpdf的使用
Nov 24 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
laravel请求参数校验方法
Oct 10 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 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/10/09 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Python中反射和描述器总结
2018/09/23 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
销售高级职员求职信
2013/10/29 职场文书
物流仓管员工作职责
2014/01/06 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
大学学习委员竞选稿
2015/11/20 职场文书