<?php
// $_FILES: PHP超全局变量数量, 保存着上传文件的全部信息
/**
* 1. $_FILES: 二维数组,每个元素对应一个上传的文件
* 2. name: 原始文件名
* 3. type: 文件类型, mime类型
* 4. tmp_name: 临时目录
* 5. error: 错误代码
* 5. size: 文件大小(字节表示 byte)
*/
printf('<pre>%s</pre>', print_r($_FILES, true));
if (isset($_FILES['my_pic'])) {
$name = $_FILES['my_pic']['name'];
$type = $_FILES['my_pic']['type'];
$tmp = $_FILES['my_pic']['tmp_name'];
$err = $_FILES['my_pic']['error'];
$size = $_FILES['my_pic']['size'];
// 错误处理
if ($err > 0) {
$tips = '<span style="color:red,fontsize:larger">上传失败</span>';
switch ($err) {
case 1:
$tips .= '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
break;
case 2:
$tips .= '文件大小超过了上传表单中MAX_FILE_SIZE最大值';
break;
case 3:
$tips .= '文件只有部分被上传';
break;
case 4:
$tips .= '没有文件被上传';
break;
case 6:
$tips .= '找不到临时目录';
break;
case 7:
$tips .= '文件写入失败,请检查目录权限';
break;
}
echo "<p>$tips</p>";
} else {
// 判断用户是否是通过合法的POST方式上传
if (is_uploaded_file($tmp)) {
// 设置允许上传类型的白名单
$allow = ['jpg', 'png', 'jpeg', 'gif'];
$ext = pathinfo($name)['extension'];
// pathinfo() 函数以数组的形式返回关于文件路径的信息。
// 返回的数组元素如下:
// [dirname]: 目录路径
// [basename]: 文件名
// [extension]: 文件后缀名
// [filename]: 不包含后缀的文件名
if (in_array($ext, $allow)) {
// 满足条件,将图片转存为本地
$path = 'uploads/';
// 自定义文件名
$dest = $path . md5($name) . '.' . $ext;
// 将文件从临时目录中移动到目标目录并重命名
if (move_uploaded_file($tmp, $dest)) {
echo '<p style="fontsize:large">上传成功</p>';
echo "<img src='$dest',width='200'>";
} else {
echo '<p style="fontsize:large">移动失败</p>';
}
} else {
echo '<p style="color:red">文件类型错误</p>';
}
} else {
echo '<p style="color:red">非法方式上传</p>';
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>单文件上传</title>
</head>
<body>
<!-- 允许单文件的表单特征:
1、method为POST
2、enctype为"multipart/form-data" -->
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>单文件上传</legend>
<input type="file" name="my_pic">
<button>上传</button>
</fieldset>
</form>
</body>
</html>


多文件上传
方式1
<?php
printf('<pre>%s</pre>', print_r($_FILES, true));
if ((isset($_FILES['my_pic1'])) || (isset($_FILES['my_pic2'])) || (isset($_FILES['my_pic3']))) {
foreach ($_FILES as $file) {
$name = $file['name'];
$type = $file['type'];
$tmp = $file['tmp_name'];
$err = $file['error'];
$size = $file['size'];
// 错误处理
if ($err > 0) {
$tips = '<span style="color:red,fontsize:larger">上传失败</span>';
switch ($err) {
case 1:
$tips .= '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
break;
case 2:
$tips .= '文件大小超过了上传表单中MAX_FILE_SIZE最大值';
break;
case 3:
$tips .= '文件只有部分被上传';
break;
case 4:
$tips .= '没有文件被上传';
break;
case 6:
$tips .= '找不到临时目录';
break;
case 7:
$tips .= '文件写入失败,请检查目录权限';
break;
}
echo "<p>$tips</p>";
} else {
// 判断用户是否是通过合法的POST方式上传
if (is_uploaded_file($tmp)) {
// 设置允许上传类型的白名单
$allow = ['jpg', 'png', 'jpeg', 'gif'];
$ext = pathinfo($name)['extension'];
// pathinfo() 函数以数组的形式返回关于文件路径的信息。
// 返回的数组元素如下:
// [dirname]: 目录路径
// [basename]: 文件名
// [extension]: 文件后缀名
// [filename]: 不包含后缀的文件名
if (in_array($ext, $allow)) {
// 满足条件,将图片转存为本地
$path = 'uploads/';
// 自定义文件名
$dest = $path . md5($name) . '.' . $ext;
// 将文件从临时目录中移动到目标目录并重命名
if (move_uploaded_file($tmp, $dest)) {
echo '<p style="fontsize:large">上传成功</p>';
echo "<img src='$dest',width='200'>";
} else {
echo '<p style="fontsize:large">移动失败</p>';
}
} else {
echo '<p style="color:red">文件类型错误</p>';
}
} else {
echo '<p style="color:red">非法方式上传</p>';
}
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>多文件上传1</title>
</head>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>多文件上传:逐个上传</legend>
<input type="file" name="my_pic1">
<input type="file" name="my_pic2">
<input type="file" name="my_pic3">
<button>上传</button>
</fieldset>
</form>
</body>
</html>


方式2
<!DOCTYPE html>
<?php
printf('<pre>%s</pre>', print_r($_FILES, true));
if (isset($_FILES['my_pic'])) {
for ($i = 0; $i < 3; $i++) {
$name = $_FILES['my_pic']['name'][$i];
$type = $_FILES['my_pic']['type'][$i];
$tmp = $_FILES['my_pic']['tmp_name'][$i];
$err = $_FILES['my_pic']['error'][$i];
$size = $_FILES['my_pic']['size'][$i];
if ($err > 0) {
$tips = '<span style="color:red,fontsize:larger">上传失败</span>';
switch ($err) {
case 1:
$tips .= '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
break;
case 2:
$tips .= '文件大小超过了上传表单中MAX_FILE_SIZE最大值';
break;
case 3:
$tips .= '文件只有部分被上传';
break;
case 4:
$tips .= '没有文件被上传';
break;
case 6:
$tips .= '找不到临时目录';
break;
case 7:
$tips .= '文件写入失败,请检查目录权限';
break;
}
echo "<p>$tips</p>";
} else {
// 判断用户是否是通过合法的POST方式上传
if (is_uploaded_file($tmp)) {
// 设置允许上传类型的白名单
$allow = ['jpg', 'png', 'jpeg', 'gif'];
$ext = pathinfo($name)['extension'];
// pathinfo() 函数以数组的形式返回关于文件路径的信息。
// 返回的数组元素如下:
// [dirname]: 目录路径
// [basename]: 文件名
// [extension]: 文件后缀名
// [filename]: 不包含后缀的文件名
if (in_array($ext, $allow)) {
// 满足条件,将图片转存为本地
$path = 'uploads/';
// 自定义文件名
$dest = $path . md5($name) . '.' . $ext;
// 将文件从临时目录中移动到目标目录并重命名
if (move_uploaded_file($tmp, $dest)) {
echo '<p style="fontsize:large">上传成功</p>';
echo "<img src='$dest',width='200'>";
} else {
echo '<p style="fontsize:large">移动失败</p>';
}
} else {
echo '<p style="color:red">文件类型错误</p>';
}
} else {
echo '<p style="color:red">非法方式上传</p>';
}
}
}
}
?>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>多文件上传2</title>
</head>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>多文件上传:逐个上传2</legend>
<!-- 数组来表示每个要上传的表单域的名称 -->
<input type="file" name="my_pic[]">
<input type="file" name="my_pic[]">
<input type="file" name="my_pic[]">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
