轻松实现php文件上传功能


Posted in PHP onFebruary 17, 2017

PHP 文件上传

通过 PHP,可以把文件上传到服务器。

本章节实例在 test 项目下完成,目录结构为:

test
|-----upload             # 文件上传的目录
|-----form.html          # 表单文件
|-----upload_file.php    # php 上传代码

源码下载:文件上传

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

<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
 <label for="file">文件名:</label>
 <input type="file" name="file" id="file"><br>
 <input type="submit" name="submit" value="提交">
</form>

</body>
</html>

将以上代码保存到 form.html 文件中。
有关上面的 HTML 表单的一些注意项列举如下:

1.<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
2.<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:

<?php
if ($_FILES["file"]["error"] > 0)
{
 echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
 echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
 echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
 echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
 echo "文件临时存储的位置: " . $_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、.jpg、.png 文件,文件大小必须小于 200 kB:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);  // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
 if ($_FILES["file"]["error"] > 0)
 {
 echo "错误:: " . $_FILES["file"]["error"] . "<br>";
 }
 else
 {
 echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
 echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
 echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
 echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
 }
}
else
{
 echo "非法的文件格式";
}
?>

保存被上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);  // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
 if ($_FILES["file"]["error"] > 0)
 {
 echo "错误:: " . $_FILES["file"]["error"] . "<br>";
 }
 else
 {
 echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
 echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
 echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
 echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
 
 // 判断当期目录下的 upload 目录是否存在该文件
 // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
 if (file_exists("upload/" . $_FILES["file"]["name"]))
 {
 echo $_FILES["file"]["name"] . " 文件已经存在。 ";
 }
 else
 {
 // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
 echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
 }
 }
}
else
{
 echo "非法的文件格式";
}
?>

上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的目录下。
文件上传演示操作如下所示:

轻松实现php文件上传功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP新手入门学习方法
May 08 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP 数组和字符串互相转换实现方法
Mar 26 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
php生成短网址示例
May 05 PHP
PHP速成大法
Jan 30 PHP
php限制ip地址范围的方法
Mar 31 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP7 安装event扩展的实现方法
Oct 08 PHP
详细分析PHP7与PHP5区别
Jun 26 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 #PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 #PHP
php使用parse_str实现查询字符串解析到变量中的方法
Feb 17 #PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 #PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 #PHP
PHP中单例模式与工厂模式详解
Feb 17 #PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 #PHP
You might like
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
详解django.contirb.auth-认证
2018/07/16 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
土建资料员岗位职责
2014/01/04 职场文书
2014年政协工作总结
2014/12/09 职场文书
2015年班组工作总结
2015/04/20 职场文书
2016年国培研修日志
2015/11/13 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
python 提取html文本的方法
2021/05/20 Python
pandas中pd.groupby()的用法详解
2022/06/16 Python