Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:完成的相当OK,
file_upload
: On / Off 是否允许上传文件upload_tmp_dir
: 文件上传临时目录upload_max_filesize
: 默认32M, 单个文件上传的最大尺寸post_max_size
: 允许通过post方式提交的数据量大小, 至少要大于upload_max_filesize
max_file_uploads
: 默认20, 单个请求, 允许上传的最大文件数量is_uploaded_file()
: 检测是否是通过POST方式上传的文件,——检测临时文件是否合法move_uploaded_file()
: 移动临时文件到用户自定义的目录中2.3 $_FILES
: 超全局变量,以数组形式展示上传文件的一些基础信息
2.4 错误信息:0: UPLOAD_ERR_OK
, 没有错误发生,文件上传成功1: UPLOAD_ERR_INI_SIZE
, 上传的文件超过了 php.ini 中 upload_max_filesize
选项限制的值2: UPLOAD_ERR_FORM_SIZE
, 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE
选项指定的值3: UPLOAD_ERR_PARTIAL
, 文件只有部分被上传(网络临时中断,只有部分上传)4: UPLOAD_ERR_NO_FILE
, 没有文件被上传6: UPLOAD_ERR_NO_TMP_DIR
, 找不到临时文件目录(文件夹或改动,极少遇到,除非人为恶意)7: UPLOAD_ERR_CANT_WRITE
, 文件写入失败, 上传目录无写的权限
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PDF文件上传</title>
</head>
<body>
<!-- action:处理上传脚本, method: 必须是POST, multipart/form-data:允许接收表单提交的文件 -->
<form action="demo2.php" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>PDF文件上传</legend>
<!-- 这个上传文件大小的限制字段,必须写到file字段的前面 -->
<input type="hidden" name="MAX_FILE_SIZE" value="600">
<input type="file" name="user_pic">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
<?php
namespace chapter8;
use Exception;
// 处理用户文件上传
try {
// 1. 判断文件是否上传成功:查看user_pic键下error的值
$errorCode = $_FILES['user_file']['error'];
if ( $errorCode > UPLOAD_ERR_OK) {
switch ($errorCode) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('上传的文件超过了php.ini中upload_max_filesize选项限制的值');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('上传文件的大小超过了HTML表单中 MAX_FILE_SIZE选项指定的值');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件只有部分被上传');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('没有文件被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('找不到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('未知类型错误');
}
}
// 2. 判断临时文件是否合法:
$tmpFile = $_FILES['user_file']['tmp_name'];
if (true === is_uploaded_file($tmpFile)) {
// 获取上传文件的扩展名
$extension = pathinfo($_FILES['user_file']['name'])['extension'];
if ($extension === 'pdf') {
// 目标文件名
$destName = 'uploads/' . md5($_FILES['user_file']['name']).time() . '.' . $extension;
// 3. 将临时文件移动到用户目录中
if (move_uploaded_file($tmpFile, $destName)) {
echo '<script>alert("上传成功");location.href="form1.html";</script>';
}
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('非法操作');
}
} catch (Exception $e) {
echo $e->getMessage();
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<!-- action:处理上传脚本, method: 必须是POST, multipart/form-data:允许接收表单提交的文件 -->
<form action="demo3.php" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>文件上传</legend>
<!-- 控件名称有数组方式表示-->
<input type="file" name="user_pic[]">
<input type="file" name="user_pic[]">
<input type="file" name="user_pic[]">
<input type="file" name="user_pic[]">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
<?php
namespace chapter8;
use Exception;
// print_r($_FILES);
// 目标: 将这个二维数组转为一维格式
// $images: 创建一个数组保存所有已经格式化后的每个文件的信息
$images = [];
foreach ($_FILES as $value) {
//判断是否是多文件上传:$_FILES里面任意一个键是数组就是
if (is_array($value['name'])) {
for ($i = 0; $i < count($value['name']); $i++) {
$images[] = [
'name' => $value['name'][$i],
'type' => $value['type'][$i],
'tmp_name' => $value['tmp_name'][$i],
'error' => $value['error'][$i],
'size' => $value['size'][$i],
];
}
}
}
echo '<hr>';
//print_r($images);
//再次遍历获取到的数组
foreach ($images as $image) {
try {
// 1. 判断文件是否上传成功?
$errorCode = $image['error'];
if ( $errorCode > UPLOAD_ERR_OK) {
switch ($errorCode) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值');
break;
case UPLOAD_ERR_PARTIAL:
throw new Exception('文件只有部分被上传');
break;
case UPLOAD_ERR_NO_FILE:
throw new Exception('没有文件被上传');
break;
case UPLOAD_ERR_NO_TMP_DIR:
throw new Exception('找不到临时文件夹');
break;
case UPLOAD_ERR_CANT_WRITE:
throw new Exception('文件写入失败');
break;
default:
throw new Exception('未知类型错误');
}
}
// 2. 判断临时文件是否合法?
$tmpFile = $image['tmp_name'];
// 设置允许上传文件类型
$allowFileTypes = ['jpg', 'jpeg', 'png', 'gif'];
if (true === is_uploaded_file($tmpFile)) {
// 获取上传文件的扩展名
$extension = pathinfo($image['name'])['extension'];
if (in_array($extension, $allowFileTypes)) {
// 目标文件名
$destName = 'uploads/' . md5($image['name']).time() . '.' . $extension;
// 3. 将临时文件移动到用户目录中
if (move_uploaded_file($tmpFile, $destName)) {
echo '<script>alert("上传成功");location.href="form2.html";</script>';
}
} else {
throw new Exception('文件类型错误');
}
} else {
throw new Exception('非法操作');
}
} catch (Exception $e) {
echo $e->getMessage();
}
}