form表单提交的文件内容指向了file.php。
我们在file.php中,通过PHP代码,来处理上传文件。
我们选择一个图片进行上传。假设图片的名字为:psu.jpg,点击上传。
PHP为文件类数据准备了一个专用的系统函数$_FILES,上传文件的所有相关数据,都保存在这个系统函数中。
在PHP文件中,我们打印 $_FILES ,来观察这个数组的结构:
~~~
<?php
//var_dump()或print_r()
//打印变量的相关信息,将变量的信息详细的展示出来
var_dump($_FILES);
?>
~~~
打印出来的结果的数组结构如下:
~~~
array (size=1)
'file' =>
array (size=5)
//文件名
'name' => string 'psu.jpg' (length=7)
//文件的mime类型
'type' => string 'image/jpeg' (length=10)
//缓存文件,上传的图片即保存在这里
'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23)
//错误码,详见上面错误码介绍
'error' => int 0
//上传的文件大小
'size' => int 225824
~~~
得到了上面的数组结构。
我们就可以开始文件的处理过程了。
**第一步,判断错误码:**
~~~
<?php
if($_FILES['file']['error'] > 0){
switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误
case '1':
echo '文件过大';
break;
case '2':
echo '文件超出指定大小';
break;
case '3':
echo '只有部分文件被上传';
break;
case '4':
echo '文件没有被上传';
break;
case '6':
echo '找不到指定文件夹';
break;
case '7':
echo '文件写入失败';
break;
default:
echo "上传出错<br/>";
}
}else{
//错误码为0,即上传成功,可以进行后续处理,处理流程见下文
}
?>
~~~
上面的代码详细的介绍了错误码和对应的错误,我们可以根据错误码,来生成准确的错误提示。
**第二步,判断文件是否超出大小。**
在实际项目中,由于系统硬件的限制,以及存储设备的限制,不可能让用户无限制的上传文件,所以我们要对用户上传的文件大小进行限制。定义一个合适的限制大小,能让我们的应用更稳定的运行。
~~~
//判断错误
if($_FILES['file']['error'] > 0){
//有错误可停止执行
}else{
//当前上传文件无误,运行本段代码
//判断文件是否超出了指定的大小
//单位为byte
$MAX_FILE_SIZE = 100000;
if($_FILES['file']['size'] > $MAX_FILE_SIZE){
//判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示
exit("文件超出指定大小");
}
~~~
将我们指定的文件大小,定义为$MAX_FILE_SIZE,该变量的计数单位为byte,对应上传文件的 $_FILES['file']['size']大小。
示例代码中,限制大小约为100K及以下的文件。
**第三步,判断文件的mime类型是否正确。**
更多的时候,我们的文件上传功能,都需要判断用户上传的文件,是否符合要求,不可用的文件上传以后,对于线上应用的整体展示效果,会造成恶劣的影响。所以我们需要通过mime类型和后缀名,来判断用户上传的文件是否符合要求。
下面的示例代码中,我们假设当前的项目需求为指定上传图片,要求上传后缀名为GIF或者jpg的文件,当用户上传不符合要求的文件时,返回错误提示。
~~~
/*判断后缀名和MIME类型是否符合指定需求
例如:
当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array('jpg','gif');
*/
//定义允许的后缀名数组
$myImg = explode('.', $_FILES['file']['name']);
/*
explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用'.''切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值
*/
$myImgSuffix = array_pop($myImg);
/*
根据上传文件名获取文件的后缀名
使用in_array()函数,判断上传文件是否符合要求
当文件后缀名不在我们允许的范围内时退出上传并返回错误信息
*/
if(!in_array($myImgSuffix, $allowSuffix)){
exit("文件后缀名不符");
}
/*
mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。
mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名
导致文件不可用或上传的文件不符合要求。
*/
//数组内容为允许上传的mime类型
$allowMime = array(
"image/jpg",
"image/jpeg",
"image/pjpeg",
"image/gif"
);
if(!in_array($_FILES['file']['type'], $allowMime)){ //判断上传文件的mime类型是否在允许的范围内
exit('文件格式不正确,请检查');
//如果不在允许范围内,退出上传并返回错误信息
}
~~~
**第四步,生成指定的路径和文件名。**
按照项目的文件安排,生成文件存储路径,为了避免文件名重复而产生的错误,按照一定的格式,生成一个随机文件名。
~~~
//指定上传文件夹
$path = "upload/images/";
/*
根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名
*/
$name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;
~~~
**第五步,判断是否是上传文件。**
is_uploaded_file()函数是专用的函数,来判断目标文件是否是上传文件。
~~~
<?php
//使用is_uploaded_file()判断是否是上传文件,函数介绍见上文
if(is_uploaded_file($_FILEs['file']['tmp_name'])){
}
?>
~~~
**第六步,移动文件到指定位置。**
使用move_uploaded_file()函数,将文件移动到指定的位置,并命名。需要注意的是,Linux系统中对目标目录是否有权限及磁盘空间是否足够,否则会导致上传操作失败。
~~~
/*
使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。
*/
if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){
//提示文件上传成功
echo "上传成功";
}else{
/*
文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限
*/
echo '上传失败';
}
}else{
echo '不是上传文件';
}
}
?>
~~~
我们将这个文件片段整理成一整个文件:
~~~
<?php
if ($_FILES['file']['error'] > 0) {
switch ($_FILES['file']['error']) {
//错误码不为0,即文件上传过程中出现了错误
case '1':
echo '文件过大';
break;
case '2':
echo '文件超出指定大小';
break;
case '3':
echo '只有部分文件被上传';
break;
case '4':
echo '文件没有被上传';
break;
case '6':
echo '找不到指定文件夹';
break;
case '7':
echo '文件写入失败';
break;
default:
echo "上传出错<br/>";
}
} else {
$MAX_FILE_SIZE = 100000;
if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {
exit("文件超出指定大小");
}
$allowSuffix = array(
'jpg',
'gif',
);
$myImg = explode('.', $_FILES['file']['name']);
$myImgSuffix = array_pop($myImg);
if (!in_array($myImgSuffix, $allowSuffix)) {
exit("文件后缀名不符");
}
$allowMime = array(
"image/jpg",
"image/jpeg",
"image/pjpeg",
"image/gif",
);
if (!in_array($_FILES['file']['type'], $allowMime)) {
exit('文件格式不正确,请检查');
}
$path = "upload/images/";
$name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix;
if (is_uploaded_file($_FILEs['file']['tmp_name'])) {
if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) {
echo "上传成功";
} else {
echo '上传失败';
}
} else {
echo '不是上传文件';
}
}
?>
~~~
- 01. 为什么选择本书学习PHP
- 1.1 为什么学习PHP?
- 1.2 PHP是什么
- 1.3 零基础也能学习
- 1.4 为什么有些人学不会
- 02.PHP的环境安装
- 2.1开发环境是什么?
- 2.2 windows环境安装
- 2.3 Linux环境安装
- 2.4 其他开发环境
- 2.5 写代码的工具选择
- 03. PHP基本语法
- 3.1 PHP基本语法
- 3.1.1 写出你的第一段PHP代码
- 3.1.2 读过初中你就会变量
- 3.1.3 echo 显示命令
- 3.1.4 注释的功能很强大
- 3.2 数据类型并不神秘
- 3.2.1 整型就是整数
- 3.2.2 布尔就是易经的知识
- 3.2.3 字符串
- 3.2.4 浮点型
- 3.2.5 重要:if和else语法
- 3.2.6 NULL类型
- 3.2.7对象以后会学
- 3.2.8 数组会有单纯的一个章节
- 3.2.9 资源类型
- 3.2.10 眼前了解回调类型即可
- 3.2.11 查看和判断数据类型
- 3.2.12 数据类型的自动转换和强制转换
- 3.3 常量和变量
- 3.3.1 用常量限制用户跳过某些文件
- 3.3.2 可变变量
- 3.3.3 外部变量
- 3.3.4 环境变量
- 3.3.5 变量引用
- 3.4 PHP表达式与运算符
- 3.4.1 算术运算
- 3.4.2 赋值运算
- 3.4.3 自加、自减运算
- 3.4.4 比较运算
- 3.4.5 逻辑运算
- 3.4.6 位运算
- 3.4.7 运算符优先级
- 3.4.8 三元运算符和其它运算符
- 04. PHP中的流程控制
- 4.1 if条件结构流程
- 4.1.1 if语句
- 4.1.2 嵌套if...else...elseif结构
- 4.1.3 if语句多种嵌套
- 4.2 分支结构switch语句的使用
- 4.3 循环语句的使用
- 4.3.1 while循环
- 4.3.2 do...while循环的区别
- 4.3.3 for循环控制语句
- 4.3.4 goto语法
- 4.3.5 declare 语法
- 05.PHP的函数基本语法
- 5.1 自定义函数
- 5.2 自定义函数高级调用
- 5.2.1 回调函数
- 5.2.2 变量函数
- 5.2.3 匿名函数
- 5.2.4 内部函数
- 5.2.5 变量作用域
- 5.2.6 参数的引用
- 5.2.7 递归函数
- 5.2.8 静态变量
- 5.3 使用系统内置函数
- 5.4 文件包含函数
- 5.5 数学常用函数
- 5.6 日期常用函数
- 5.6.1 获取时期时间信息函数
- 5.6.2 日期验证函数
- 5.6.3 获取本地化时间戳函数
- 5.6.4 程序执行时间检测
- 5.7 字符串常用函数
- 06.PHP数组与数据结构
- 6.1 数组的定义
- 6.2 数组的操作
- 6.2.1 数组的计算
- 6.2.2 for循环遍历索引数组
- 6.2.3 foreach遍历关联数组
- 6.2.4 list、each函数遍历数组
- 6.2.5 常用操作数组函数
- 6.3 数组的常用函数
- 07. PHP中的正则达达式
- 7.1 正则表达示的定界符
- 7.2 正则表达示中的原子
- 7.3 正则表示中的元字符
- 7.4 正则达达示中的模式修正符
- 7.5 写正则的诀窍和常用正则
- 7.6 用正则写一个UBB文本编辑器
- 08.文件系统
- 8.1 读取文件
- 8.2 创建和修改文件内容
- 8.3 创建临时文件
- 8.4 移动、拷贝和删除文件
- 8.5 检测文件属性函数
- 8.6 文件常用函数和常量
- 8.7 文件锁处机制
- 8.8 目录处理函数
- 8.9 文件权限设置
- 8.10文件路径函数
- 8.11 小小文件留言本
- 8.12 修改配置文件的实例
- 09.PHP文件上传
- 9.1 文件上传需要注意php.ini文件
- 9.2 文件上传的步骤
- 9.3 文件上传表单注意事项
- 9.4 按照数组和步骤完成文件上传
- 9.5 多文件上传
- 9.6 文件上传进度处理
- 10.PHP图像处理
- 10.1 学习前的准备工作
- 10.2 用图片处理函数画一张图
- 10.3 生成验证码
- 10.4 图像缩放和裁剪技术
- 10.5 图片水印处理
- 11.错误处理
- 11.1 禁止显示错误
- 11.2 错误报告级别
- 11.3 错误记录日志
- 11.4 自定义错误处理函数
- 12.MySQL 入门
- 12.1 请进入《MySQL入门》
- 13. PHP操作mysql数据库
- 13.1 数据库连接步骤
- 13.2 通过步骤做一个用户注册
- 13.3 通过步骤做一个列表显示
- 13.4 把用户做个分页
- 13.5 批量和指定删除用户
- 13.6 修改用户信息
- 13.7 数据显示乱码终极解决办法
- 14.会话管理和控制
- 14.1 Cookie概述
- 14.2PHP中的Cookie
- 14.3 session概述
- 14.4 PHP中使用session
- 14.5 SESSION应用实例
- 15.通过cURL来做小偷程序
- 15.1 curl的使用步骤
- 15.2 自定义get方法抓取网页
- 15.3 使用post发送数据
- 16. 用PHP写一个论坛
- 16.1 web2.0始于论坛
- 16.2 需求:开发前你要知道他的样子
- 16.3 核心业务流程
- 16.3.1 用户注册流程
- 16.3.2 普通用户和管理员登陆流程
- 16.3.3 发贴流程
- 16.3.4 回复流程
- 16.3.5 版块管理流程
- 16.3.6 版主业务流程
- 16.3.7 金币奖励和消耗流程
- 16.4 数据库表设计
- 16.5 文件和代码规范
- 16.6 核心功能说明
- 16.6.1 项目目录结构说明
- 16.6.2 公共文件的使用
- 16.6.3 模板引擎讲解
- 16.6.4 用户注册、登陆功能讲解
- 16.6.5 发帖功能讲解
- 16.6.6 回帖功能讲解
- 16.6.7 项目安装模块讲解
- 附录1. 版权声明
- 附录2 . 学习PHP常用的英文单词