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第九步,有人会吗?

全部评论
可以将就用,但是不完美
点赞 回复 分享
发布于 2023-05-29 10:54 广东

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务