1.首先了解PHP的$_FILES
$_FILES 是一个预定义的数组,用来获取通过 POST 方法上传文件的相关信息。
$_FILES数组内容如下:
- $_FILES[‘File’][‘name’] 客户端文件的原名称。
- $_FILES[‘File’][‘type’] 文件的 MIME 类型,需要浏览器提供该信息的支持.
- $_FILES[‘File’][‘size’] 已上传文件的大小,单位为字节。
- $_FILES[‘File’][‘tmp_name’] 文件被上传后在服务端储存的临时文件名,
- $_FILES[‘myFile’][‘error’] 和该文件上传相关的错误代码。
例子:
//接收一个文件,输出$_FILES
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
var_dump($_FILES);
}
2.使用form表单上传
- 主要思想是把 POST 方法上传的临时文件移动到目标目录。
<?php
function upload () {
// 客户端提交的表单内容中根本没有文件域
if (!isset($_FILES['avatar'])) {
//全局变量,提示信息
$GLOBALS['message'] = '上传失败';
return;
}
$avatar = $_FILES['avatar'];
// $avatar => array(5) {
// ["name"]=>
// string(11) "02.png"
// ["type"]=>
// string(9) "image/png"
// ["tmp_name"]=>
// string(27) "C:\Windows\Temp\php1138.tmp" //这个是临时文件
// ["error"]=>
// int(0)
// ["size"]=>
// int(4398)
// }
if ($avatar['error'] !== UPLOAD_ERR_OK) {
// 服务端没有接收到上传的文件
$GLOBALS['message'] = '上传失败';
return;
}
// 校验类型 图片类型
$allowed_types = array('image/jpeg', 'image/png', 'image/gif');
if (!in_array($avatar['type'], $allowed_types)) {
$GLOBALS['message'] = '这是不支持的图片格式';
return;
}
// 重要思路是将临时文件移动到网站范围之内
$source = $avatar['tmp_name']; // 临时文件
// => 'C:\Windows\Temp\php1138.tmp'
$target = './uploads/' . $avatar['name']; // 目标放在哪
// => './uploads/icon-02.png'
// 移动的目标路径中文件夹一定是一个已经存在的目录
$moved = move_uploaded_file($source, $target);
$GLOBALS['message'] = '上传成功';
if (!$moved) {
$GLOBALS['message'] = '上传失败';
return;
}
// 移动成功
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 接收文件 使用一个 叫做 $_FILES 超全局成员
//调用函数
upload();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!-- action为本php, encodetype是编码类型,“multipart/form-data”是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思-->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input type="file" name="avatar">
<button>上传</button>
<!--php和html混合使用,用php的全局变量提示错误信息-->
<?php if (isset($message)): ?>
<p ><?php echo $message; ?></p>
<?php endif ?>
</form>
</body>
</html>
效果:
(1)上传非图片文件
(2)上传图片
3.解决上传文件大小限制
- 修改 php.ini 中的 post_max_size 配置,让服务端可以接受更大的请求体体积
- 修改 php.ini 中的 upload_max_filesize 配置,让服务端支持更大的单个上传文件