ThinkPHP + Layui 上传文件
特别申明:
1、不够完美,有BUG,但是也能用
2、后端 第 九 步 还需要判断:如果 文件夹 不存在,则创建 该文件夹 功能
3、由于文件保存在public目录下,可以直接使用url访问文件,不够隐私,安全性差
详解:
1、确保你的thinkphp为单应用状态
2、你需要在 public 目录下面手动创建 upload 文件夹
3、在app\controller的目录下创建一个名为:Upload.php的文件(控制器)
4、请确保你的layui、jquery放在了static目录下面
5、将下面代码复制到 Upload.php中
<?php
namespace app\controller;
use think\facade\View;
use think\facade\Request;
Class Upload{
public function index(){
return View::fetch();
}
public function upload(){
// $_FILES 数组 键值 说明:
// 1、上传文件名: $_FILES["file"]["name"]
// 2、文件类型: $_FILES["file"]["type"]
// 3、文件大小: $_FILES["file"]["size"] / 1024) kB
// 4、文件临时存储的位置: $_FILES["file"]["tmp_name"]
// 第一步:配置允许上传的文件类型
$file_types = [
"image/gif",
"image/jpeg",
"image/jpg",
"image/pjpeg",
"image/x-png",
"image/png",
"application/pdf",
"application/vnd.ms-excel"
];
// 第二步:如果被上传的文件类型 不在 允许上传的类型范围内
if(!in_array($_FILES["file"]["type"],$file_types)){
return json(['status'=>100,'msg'=>'文件类型不符合要求','path'=>'M']);
exit;
};
// 第三步:配置允许上传的文件大小 5M
// 说明:单位为字节
// 5242880 字节 = 5120 千字节 KB
// 5242880 字节 = 5 兆字节 M
$file_size = 5242880;
// 第四步:如果被上传的文件 大小 超过 允许上传的 文件大小
if($_FILES["file"]["size"] > $file_size){
return json(['status'=>100,'msg'=>'上传失败,文件太大了','path'=>'']);
exit;
}
// 第五步:配置允许上传的文件后缀
// 说明:有时候文件类型 和 文件后缀 并不相同(比如用户修改后缀)
$file_fomat = array("gif", "jpeg", "jpg", "png","pdf","xls","xlms");
// 第六步:获取被上传文件的后缀名(格式)
// 说明函数:explode 取 "."之前的字符
$file_nemes = explode(".", $_FILES["file"]["name"]);
// 第七步:获取被上传文件的名称,赋值给变量
$extension = end($file_nemes);
// 第七步:判断被上传的文件后缀名是否合法
if(!in_array($extension,$file_fomat)){
return json(['status'=>100,'msg'=>'文件后缀名不合法','path'=>'']);
exit;
}
// 第九步:判断 public 目录下的 upload 目录是否存在
// 如果没有 upload 目录,需要创建它,upload 目录权限为 777
// 第十步:判断当前目录下是否有同名文件
if (file_exists("upload/" . $_FILES["file"]["name"])){
return json(['status'=>100,'msg'=>'上传失败,原因:'.$_FILES["file"]["name"] . " 文件已经存在。",'path'=>'']);
exit;
}
// // 第十一步:把被上传的文件移动到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
// 第十一步:返回前端需要的数据格式 json
return json(['status'=>200,'msg'=>'上传成功,待保存表单','path'=>"upload/" . $_FILES["file"]["name"]]);
}
}
5、在app\view目录下创建一个Upload文件夹
6、在app\view\Upload目录下创建一个 index.html 文件
7、把下面代码复制到 index.html 文件中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Demo</title>
<!-- 请勿在项目正式环境中引用该 layui.css 地址 -->
<link rel="stylesheet" href="\static\layui\css\layui.css">
</head>
<body>
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">标签</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="firstID">
<i class="layui-icon"></i>上传按钮
</button>
<input type="hidden" name="url" id="secondID">
</div>
</div>
</form>
<script src="\static\layui\layui.js"></script>
<script src="\static\jquery\jquery.js"></script>
<script>
layui.use(['upload','form'], function(){
var upload = layui.upload;
var form = layui.form;
upload.render({
elem: '#firstID', //选中你要绑定的上传组件
url: '/index.php/Upload/upload',//上传接口
accept:'file', //文件类型,不写默认是images,file表示全类型
done: function(res){ //上传完回调,这里的res必须是json类型
if (res.status === 200) {
layer.msg(res.msg, {icon: 1});
$('#secondID').val(res.path); //回填路径值
}else{
layer.msg(res.msg, {icon: 2});
}
},
error: function(){
layer.msg('error'+ res.status, {icon: 2});
}
});
});
</script>
</body>
</html>
8、浏览器输入url:www.你的域名.com/index.php/Upload/index
9、问题:thinkphp第九步,有人会吗?
