轻松实现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中其实也可以用方法链
Nov 10 PHP
php数字游戏 计算24算法
Jun 10 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
php用户登录之cookie信息安全分析
May 13 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
yii2 上传图片的示例代码
Nov 02 PHP
PHP实现的策略模式示例
Mar 20 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 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
德生H-501的评价与改造
2021/03/02 无线电
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
基于php判断客户端类型
2016/10/14 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
深入浅析Python的类
2018/06/22 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
explicit和implicit的含义
2012/11/15 面试题
公司保密承诺书
2014/03/27 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
校园安全主题班会
2015/08/12 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
如何写好活动总结
2019/06/21 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers