前端页面 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传表单</title>
</head>
<body>
<!--请求类型必须是POST, 数据编码类型必须是: 复合表单数据,让服务器知道上传的是文件-->
<form action="demo1.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file" id="">
<!-- 隐藏域:限制上传文件大小, 不超过php.ini: upload_max_filesize值-->
<!-- 1M=1024k=1048576字节, 3M = 3145728字节-->
<input type="hidden" name="MAX_FILE_SIZE" value="3145728">
<button>上传</button>
</form>
</body>
</html>
PHP处理页面 demo1.php
<?php
// 后端PHP主要使用超全局变量: $_FILES 来处理上传的文件
if (!isset($_FILES['my_file'])) {
echo '<script>alert("没有文件被上传");location.assign("index.html");</script>';
exit;
}
// 1. 配置上传参数
// 设置允许上传的文件类型
$fileType = ['jpg', 'jpeg', 'png', 'gif'];
// 设置允许上传的最大文件长度
$fileSize = 3145728;
// 上传到服务器上指定的目录
$filePath = '/uploads/';
// 上传的原始文件名
$fileName = $_FILES['my_file']['name'];
// 上传保存在服务器上的临时文件名
$tempFile = $_FILES['my_file']['tmp_name'];
// 3. 判断上传是否成功?
// 主要是通过$_FILES['my_file']['error']值, 等于0成或,大于1出错,出错类型用switch分析
$uploadError = $_FILES['my_file']['error'];
if ($uploadError > 0) {
switch ($uploadError) {
case 1:
case 2: die('上传文件不允许超过3M');
case 3: die('上传文件不完整');
case 4: die('没有文件被上传');
default: die('未知错误');
}
}
// 3. 判断文件扩展名是否正确?
$extension = explode('.',$fileName)[1];
if (!in_array($extension, $fileType)) {
die('不允许上传' . $extension . '文件类型');
}
// 4. 为了防止同名文件相互覆盖, 应该将上传到指定目录的文件重命名,例如用md5+时间戳
$fileName = date('YmdHis',time()).md5(mt_rand(1,99)) . '.' . $extension;
// 5. 判断文件是否上传成功?
// 判断是否是通过post上传的
if (is_uploaded_file($tempFile)) {
if (move_uploaded_file($tempFile, __DIR__ . $filePath.$fileName)) {
// 提示用户上成功,并返回上一个页面,再强行刷新当前页面
echo '<script>alert("上传成功");history.back();</script>';
} else {
die('文件无法移动到指定目录,请检查目录权限');
}
} else {
die('非法操作');
}
exit();