1.文件上传
文件上传的两个前提
1.必须以POST
方式提交,method: POST
2.必须将编码类型转为多种数据提交,enctype="multipart/form-data"
multipart/form-data
是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据
1.1 单文件上传
form表单
<!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>单文件上传</fieldset>
<!-- name="my_pic":给服务器编程语言用的变量名,php中可通过$_FILES来访问 -->
<input type="file" name="my_pic">
<button>上传</button>
</form>
PHP服务端
<?php
namespace fielUpload;
// 格式化输出 $_FILES 相关信息
printf('<pre>%s</pre>', print_r($_FILES, true));
// 判断是否为空
if (isset($_FILES['my_pic'])) {
if ($_FILES['my_pic']['error'] === 0) {
// 获取扩展名
$ext = pathinfo($_FILES['my_pic']['name'])['extension'];
// 重置文件命及扩展名
$fileName = md5($_FILES['my_pic']['name']) . '.' . $ext;
// 目标文件目录
$dest = 'uploads/' . $fileName;
// 移动到目标目录中
// 参数1:临时文件目录
// 参数2:目标文件目录
move_uploaded_file($_FILES['my_pic']['tmp_name'], $dest);
// 预览
echo "<img src='$dest' width='200'>";
}
}
?>
$_FILES数据
// 前端传过来的变量名
[my_pic] => Array
(
// 文件名
[name] => 1 (1).jpg
// 文件类型
[type] => image/jpeg
// 临时文件名
[tmp_name] => D:\AnZhuangLuJi\AAAPHP\phpEnv\temp\php\php18C4.tmp
// 错误处理代码 0表示成功
[error] => 0
// 文件大小
[size] => 5850144
)
1.2 多文件上传(逐个上传)
form表单
<!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>单文件上传</fieldset>
<input type="file" name="my_pic1">
<input type="file" name="my_pic2">
<input type="file" name="my_pic3">
<button>上传</button>
</form>
PHP服务端
<?php
namespace fielUpload;
// 格式化输出 $_FILES 相关信息
printf('<pre>%s</pre>', print_r($_FILES, true));
foreach ($_FILES as $file) {
// 只要判断$file['error'] === 0 表示上传成功
if ($file['error'] === 0) {
// 获取扩展名
$ext = pathinfo($file['name'])['extension'];
// 重置文件命及扩展名
$fileName = md5($file['name']) . '.' . $ext;
// 目标文件目录
$dest = 'uploads/' . $fileName;
// 移动到目标目录中
move_uploaded_file($file['tmp_name'], $dest);
// 预览
echo "<img src='$dest' width='200'>";
}
}
?>
1.3 多文件上传(统一上传)
form表单
<!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
<form action="" method="POST" enctype="multipart/form-data">
<fieldset>单文件上传</fieldset>
<!-- 以数组的方式存放 -->
<!-- multiple: 允许同时选择多个 -->
<input type="file" name="my_pic[]" multiple>
<button>上传</button>
</form>
PHP服务端
<?php
namespace fielUpload;
// 格式化输出 $_FILES 相关信息
printf('<pre>%s</pre>', print_r($_FILES, true));
// 判断是否为空
if (isset($_FILES['my_pic'])) {
//循环遍历
foreach ($_FILES['my_pic']['error'] as $key => $error) {
// 0 => UPLOAD_ERR_OK
if ($error === UPLOAD_ERR_OK) {
// 临时文件名
$tmpName = $_FILES['my_pic']['tmp_name'][$key];
// 获取扩展名
$ext = pathinfo($_FILES['my_pic']['name'][$key])['extension'];
// 重置文件命及扩展名
$fileName = md5($_FILES['my_pic']['name'][$key]) . '.' . $ext;
// 目标文件目录
$dest = 'uploads/' . $fileName;
// 移动到目标目录中
move_uploaded_file($tmpName, $dest);
// 预览
echo "<img src='$dest' width='200'>";
}
}
}
?>
2.错误处理
// 判断上传的数据是否为空
if (isset($_FILES['my_pic'])) {
// 原始文件名
$name = $_FILES['my_pic']['name'];
// 临时文件名
$tmpName = $_FILES['my_pic']['tmp_name'];
// 错误代码
$error = $_FILES['my_pic']['error'];
//判断错误代码是否大于0,如果大于0 表示上传失败
if ($error >0) {
$tips = '<span style="color:red">上传失败!</span><br>';
// 不同的错误代码 输出不同的错误信息
// 其中错误代码5 是预留的自定义错误信息
switch ($error) {
case 1:
$tips .= '大小超过了php.ini中的允许上传的文件大小';
break;
case 2:
// MAX_FILE_SIZE:前端中传过来的最大文件大小限制的变量
$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 {
//1 判断上传方式是否合法? POST
if (is_uploaded_file($tmpName)) {
// 文件类型白名单
$allow = ['jpg','jpeg','png','gif'];
// 扩展名
$ext = pathinfo($name)['extension'];
// 判断文件上传的扩展名是否为图片的扩展名
if (in_array($ext, $allow)) {
// 如果上传方式合法,且是允许的类型,则可以移动到指定的目录中了
$path = 'uploads/';
// 为了防止同名覆盖,应该给目标文件名重命名
$dest =$path. md5($name) . '.' . $ext;
// 判断将文件从临时目录移动到目标目录中是否成功
if (move_uploaded_file($tmpName, $dest)) {
echo '<p>上传成功</p>';
// 预览
echo "<img src='$dest' width='300'>";
} else {
echo '<p>上传失败</p>';
}
} else {
echo '<p>文件类型错误</p>';
}
} else {
echo '<p>上传方式非法</p>';
}
}
}