Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:这个案例做完, 相信你对文件上传不再担心了, 因为真的不难理解
首先我们需要先了解一下PHP上传需要的配置项
max_file_upload 允许批量上传的文件数目
确认可以之后我们新建一个表单
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="demo1.php" method="POST" enctype="multipart/form-data">
<input type="file" name='xy_file'>
<button>提交</button>
</form>
</body>
</html>
enctype="multipart/form-data
千万别再表单中忘记写这个,否则你上传个锤子。
在此之前我们先看一下PHP的文件全局量$_FILES
所获取的到的数据分别是原始文件名,文件扩展名,临时目录,错误代码,文件大小。
错误代码值
UPLOAD_ERR_OK
UPLOAD_ERR_INI_SIZE
UPLOAD_ERR_FORM_SIZE
UPLOAD_ERR_PARTIAL
UPLOAD_ERR_NO_FILE
UPLOAD_ERR_NO_TMP_DIR
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
namespace chapter8;
use Exception;
/**
* 1. 判断文件是否上传成功?
* 2. 判断临时文件是否合法?
* 3. 将临时文件移动到用户目录中
*/
/**
* UPLOAD_ERR_OK
*其值为 0,没有错误发生,文件上传成功。
*UPLOAD_ERR_INI_SIZE
*其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
*UPLOAD_ERR_FORM_SIZE
*其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
*UPLOAD_ERR_PARTIAL
*其值为 3,文件只有部分被上传。
*UPLOAD_ERR_NO_FILE
*其值为 4,没有文件被上传。
*UPLOAD_ERR_NO_TMP_DIR
*其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
*UPLOAD_ERR_CANT_WRITE
*其值为 7,文件写入失败。PHP 5.1.0 引进。
*/
try {
//错误代码获取
$errorcode = $_FILES['xy_file']['error'];
if ($errorcode > UPLOAD_ERR_OK) {
switch ($errorcode) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('上传文件超过限定');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('超过表单中的设置文件大小');
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;
}
}
//判断临时文件是否合法
$file = $_FILES['xy_file']['tmp_name'];
//设置允许的上传格式
$filelx = ['pdf'];
//is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
if (is_uploaded_file($file) === true) {
//那就需要开始获取文件的扩展名
$filehz = pathinfo($_FILES['xy_file']['name'])['extension'];
if (in_array($filehz, $filelx)) {
//防止文件名重复
$dir = 'uploads';
if (!is_dir($dir)) {
mkdir($dir);
chmod($dir, 0777);
// mkdir($dir,0777,true);
}
$destname = $dir . DIRECTORY_SEPARATOR . md5($_FILES['xy_file']['name']) . time() . '.' . $filehz;
if (move_uploaded_file($file, $destname)) {
echo '<script>alert("上传成功");location.href="form1.html";</script>';
}
} else {
echo "文件上传格式不允许";
}
} else {
echo "非法操作";
}
} catch (Exception $e) {
echo $e->getMessage();
}
说实话对于单一文件上传来说是很简单的,只需要获取上传文件名,以及后缀,与允许的后缀列表进行比对即可,比对成功那么就用move_uploaded_file进行转移到指定目录,那么为什么要用time呢?是为了防止文件名重复。
好我们上传一个png图片看看
接下来我们上传一个pdf看看
多文件上传原理也是十分简单的我们在表单处多写几个上传
当然一般来说name我们会写成数组方式上传
这样子我们所上传的多个文件会是一个数组
这个文件这样子用起来会比较麻烦我们需要将他格式化!
namespace chapter8;
use Exception;
//来一手多文件上传。
//要求文件总大小不能大于10M
//post_max_size 的值<=10M即可
$img = [];
// var_dump($_FILES);
foreach ($_FILES as $value) {
if (is_array($value['error'])) {
for ($i = 0; $i < count($value['error']); $i++) {
$img[] = [
'name' => $value['name'][$i],
'type' => $value['type'][$i],
'tmp_name' => $value['tmp_name'][$i],
'error' => $value['error'][$i],
'size' => $value['size'][$i]
];
}
}
}
// var_dump($img);
//接下来已经解析为一个图片上传我们只需要重复利用一下即可
foreach($img as $imgvalue) {
try {
//错误代码获取
$errorcode =$imgvalue['error'];
if ($errorcode > UPLOAD_ERR_OK) {
switch ($errorcode) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('上传文件超过限定');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('超过表单中的设置文件大小');
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;
}
}
//判断临时文件是否合法
$file = $imgvalue['tmp_name'];
//设置允许的上传格式
$filelx = ['pdf','jpg','png','jfif'];
//is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
if (is_uploaded_file($file) === true) {
//那就需要开始获取文件的扩展名
$filehz = pathinfo($imgvalue['name'])['extension'];
if (in_array($filehz, $filelx)) {
//防止文件名重复
$dir = 'uploads';
if (!is_dir($dir)) {
mkdir($dir);
chmod($dir, 0777);
// mkdir($dir,0777,true);
}
$destname = $dir . DIRECTORY_SEPARATOR . md5($imgvalue['name']) . time() . '.' . $filehz;
if (move_uploaded_file($file, $destname)) {
echo '<script>alert("上传成功");location.href="form1.html";</script>';
}
} else {
echo "文件上传格式不允许";
}
} else {
echo "非法操作";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
这样子就可以了能够完美上传!
如何将其封装成一个函数?
namespace chapter8;
use Exception;
function upload($file){
try {
//错误代码获取
$errorcode = $file['error'];
if ($errorcode > UPLOAD_ERR_OK) {
switch ($errorcode) {
case UPLOAD_ERR_INI_SIZE:
throw new Exception('上传文件超过限定');
break;
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('超过表单中的设置文件大小');
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;
}
}
//判断临时文件是否合法
$filen = $file['tmp_name'];
//设置允许的上传格式
$filelx = ['pdf','jpg','png'];
//is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
if (is_uploaded_file($filen) === true) {
//那就需要开始获取文件的扩展名
$filehz = pathinfo($file['name'])['extension'];
if (in_array($filehz, $filelx)) {
//防止文件名重复
$dir = 'uploads';
if (!is_dir($dir)) {
mkdir($dir);
chmod($dir, 0777);
// mkdir($dir,0777,true);
}
$destname = $dir . DIRECTORY_SEPARATOR . md5($file['name']) . time() . '.' . $filehz;
if (move_uploaded_file($filen, $destname)) {
echo '<script>alert("上传成功");location.href="form1.html";</script>';
}
} else {
echo "文件上传格式不允许";
}
} else {
echo "非法操作";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
这样子就能封装成一个公用函数!