轻松实现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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
php生成文件
Jan 15 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
php实现用户在线时间统计详解
Oct 08 PHP
求PHP数组最大值,最小值的代码
Oct 31 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
php限制ip地址范围的方法
Mar 31 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 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读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
详解Python中最难理解的点-装饰器
2017/04/03 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python的链表基础知识点
2020/09/13 Python
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
财务出纳员岗位职责
2013/11/26 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
学校食品安全实施方案
2014/06/14 职场文书
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
python创建字典及相关管理操作
2022/04/13 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis