目錄
封装ThinkPHP6.0通用文件上传教程
首頁 php框架 ThinkPHP 封裝ThinkPHP6.0通用檔案上傳

封裝ThinkPHP6.0通用檔案上傳

May 04, 2020 am 11:40 AM
thinkphp 文件

本文实例讲述了封装ThinkPHP6通用文件上传方法,上传功能使用的是LayUI的upload组件。

封装ThinkPHP6.0通用文件上传教程

一、打开项目在config文件夹下创建upload.php配置文件用来管理文件上传的后缀和大小

<?php

return [
    //定义允许上传文件后缀的数组
    &#39;suffix_arr&#39;    =>  [
        //允许图片上传的后缀
        &#39;image&#39;     =>  &#39;jpg,jpeg,png,gif&#39;,
        //允许上传文件的后缀
        &#39;file&#39;      =>  &#39;zip,gz,doc,txt,pdf,xls&#39;,
        //...
    ],
    //定义允许上传文件大小的数组
    &#39;size_arr&#39;      =>  [
        //允许图片上传的大小
        &#39;image&#39;     =>  10,
        //允许文件上传的大小
        &#39;file&#39;      =>  50
    ],
];
登入後複製

二、修改config\filesystem.php配置文件配置上传根目录及上传规则

<?php

return [
    // 默认磁盘
    &#39;default&#39; => env(&#39;filesystem.driver&#39;, &#39;local&#39;),
    // 磁盘列表
    &#39;disks&#39;   => [
        &#39;local&#39;  => [
            &#39;type&#39; => &#39;local&#39;,
            &#39;root&#39; => app()->getRuntimePath() . &#39;storage&#39;,
        ],
        &#39;public&#39; => [
            // 磁盘类型
            &#39;type&#39;       => &#39;local&#39;,
            // 磁盘路径
            &#39;root&#39;       => app()->getRootPath() . &#39;public/uploads&#39;,
            // 磁盘路径对应的外部URL路径
            &#39;url&#39;        => &#39;/uploads&#39;,
            // 可见性
            &#39;visibility&#39; => &#39;public&#39;,
        ],
        // 更多的磁盘配置信息
    ],
];
登入後複製

三、 在app\controller目录下创建Upload.php类并编写upload()文件上传方法

<?php

namespace app\controller;

use think\exception\ValidateException;

class Upload
{
    //上传
    public function upload()
    {
        //判断是否是POST请求,如果是处理上传逻辑
        if (request()->isPost()){

            //接收文件上传类型
            $type = request()->param(&#39;type&#39;,&#39;&#39;,&#39;trim&#39;);
            $name = request()->param(&#39;name&#39;,&#39;&#39;,&#39;trim&#39;);
            //获取表单上传文件
            $file = request()->file(&#39;file&#39;);
            //组装文件保存目录
            $upload_dir = &#39;/&#39;.$type.&#39;/&#39;.$name;

            try {
                //从config/upload.php配置文件中读取允许上传的文件后缀和大小
                $suffix_config = config(&#39;upload.suffix_arr&#39;);
                $size_config = config(&#39;upload.size_arr&#39;);

                if (empty($size_config[$type]) || empty($size_config[$type])){
                    return false;
                }else{
                    $suffix = $suffix_config[$type];
                    $size = $size_config[$type];
                }
                //验证器验证上传的文件
                validate([&#39;file&#39;=>[
                    //限制文件大小
                    &#39;fileSize&#39;      =>  $size * 1024 * 1024,
                    //限制文件后缀
                    &#39;fileExt&#39;       =>  $suffix
                ]],[
                    &#39;file.fileSize&#39; =>  &#39;上传的文件大小不能超过&#39;.$size.&#39;M&#39;,
                    &#39;file.fileExt&#39;  =>  &#39;请上传后缀为:&#39;.$suffix.&#39;的文件&#39;
                ])->check([&#39;file&#39;=>$file]);

                //上传文件到本地服务器
                $filename = \think\facade\Filesystem::disk(&#39;public&#39;)->putFile($upload_dir, $file);
                if ($filename){
                    $src = &#39;/uploads/&#39;.$filename;
                    return json([&#39;code&#39;=>1,&#39;result&#39;=>$src]);
                }else{
                    return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;上传失败&#39;]);
                }
            }catch (ValidateException $e){
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>$e->getMessage()]);
            }
        }else{
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;非法请求&#39;]);
        }
    }
}
登入後複製

四、 打开app\controller\Index.php类并修改index方法

<?php

namespace app\controller;

use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        //渲染前端页面
        return view();
    }
}
登入後複製

五、在app\view\index目录下创建index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
    <!-- layui.css 推荐使用本地文件 -->
    <link rel="stylesheet" href="https://heerey525.github.io/layui-v2.4.3/layui-v2.4.4/css/layui.css"  media="all">
    <style>
        #avatar_thumb {
            position: absolute;
            left: 50%;top: 50%;
            width: 168px;
            height: 168px;
            margin: -50px 0 0 -84px;
            border-radius: 100%;
        }
    </style>
</head>
<body>

<div class="layui-card-body" style="text-align: center;">
    <div class="layui-form-item">
        <div style="position: relative;width: 373px;height: 373px;background-color: #F2F2F5;margin: auto;">
            <button type="button" class="layui-btn" id="avatar">
                <i class="layui-icon">&#xe67c;</i>上传头像
            </button>
            <img  src="/static/imghw/default1.png"  data-src="" id="  class="lazy"   id="avatar_thumb" alt="封裝ThinkPHP6.0通用檔案上傳" >
            <input type="hidden" name="avatar" value="">
        </div>
    </div>
</div>

<!-- layui.js 和jquery.js 推荐使用本地文件 -->
<script src="https://heerey525.github.io/layui-v2.4.3/layui-v2.4.4/layui.js" charset="utf-8"></script>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script src="/static/lib/js/common.js"></script>
<script>
    layui.use([&#39;form&#39;, &#39;upload&#39;], function() {
        var upload = layui.upload;

        //图片上传
        common_upload(&#39;avatar&#39;);

        //文件上传
        //common_upload(&#39;avatar&#39;,&#39;file&#39;);
    });
</script>
</body>
</html>
登入後複製

六、在public\static\lib\js目录下创建common.js

/**
 * @desc 通用文件上传
 * @param name  文件存储文件夹
 * @param type 文件类型:默认为图片类型(image)
 */
function common_upload(name,type=&#39;image&#39;) {

    layui.use([&#39;form&#39;, &#39;upload&#39;], function() {
        var upload = layui.upload;

        //选完文件后自动上传
        upload.render({
            elem: &#39;#&#39;+name,
            url: "/upload/upload",
            auto: true,
            accept: &#39;file&#39;, //普通文件
            data:{name:name,type:type},
            
            done: function(data) {
                console.log(data);
                //上传完毕回调
                if (data.code == 0) {
                    return layer.msg(data.msg,{icon:2});
                } else {
                    $("#"+name+"_thumb").attr(&#39;src&#39;,data.result).show();
                    $(&#39;input[name=&#39;+name+&#39;]&#39;).val(data.result);
                }
            }
        });
    });
}
登入後複製

七、测试图片上传

7.1、为了方便,本文就不在本地部署项目了,采用ThinkPHP内置的服务器

进到项目根目录,执行以下命令:

php think run
登入後複製

封裝ThinkPHP6.0通用檔案上傳

7.2、在浏览器地址栏中输入访问地址,发现报错?

封裝ThinkPHP6.0通用檔案上傳

7.3、遇到错误不要慌,我们打开ThinkPHP的调试功能,看看具体错误信息

封裝ThinkPHP6.0通用檔案上傳

7.4、通过开启调试模式,发现报错原因是我们没有安装模板引擎,在ThinkPHP6.0中默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展

封裝ThinkPHP6.0通用檔案上傳

7.5、进到项目根目录下,输入以下命令进行安装think-view模板

composer require topthink/think-view
登入後複製

7.6、再次访问,访问成功。不过图片显示的是破裂的,如果觉得不好看,小伙伴们可以自行设置一个默认图片。

封裝ThinkPHP6.0通用檔案上傳

7.7、测试图片上传。从GIF图中可以看出上传图片大小和后缀不符合配置文件中设置的值,会给出相应的提示信息,只有上传符合配置文件中设置的值的图片才会在页面中显示并存储到本地。

封裝ThinkPHP6.0通用檔案上傳

7.8、如果需要上传文件,视频或音频,只需要修改以下两个地方,这里就不演示了,小伙伴们下去自己试下。

封裝ThinkPHP6.0通用檔案上傳

八、新图片上传成功后自动删除原图,有效地减少垃圾信息的累积

8.1、在app\controller\Upload.php中添加delImg() 方法

<?php

namespace app\controller;

use think\exception\ValidateException;

class Upload
{
    //上传
    public function upload()
    {
        //判断是否是POST请求,如果是处理上传逻辑
        if (request()->isPost()){

            //接收文件上传类型
            $type = request()->param(&#39;type&#39;,&#39;&#39;,&#39;trim&#39;);
            $name = request()->param(&#39;name&#39;,&#39;&#39;,&#39;trim&#39;);
            //获取表单上传文件
            $file = request()->file(&#39;file&#39;);
            //组装文件保存目录
            $upload_dir = &#39;/&#39;.$type.&#39;/&#39;.$name;

            try {
                //从config/upload.php配置文件中读取允许上传的文件后缀和大小
                $suffix_config = config(&#39;upload.suffix_arr&#39;);
                $size_config = config(&#39;upload.size_arr&#39;);

                if (empty($size_config[$type]) || empty($size_config[$type])){
                    return false;
                }else{
                    $suffix = $suffix_config[$type];
                    $size = $size_config[$type];
                }
                //验证器验证上传的文件
                validate([&#39;file&#39;=>[
                    //限制文件大小
                    &#39;fileSize&#39;      =>  $size * 1024 * 1024,
                    //限制文件后缀
                    &#39;fileExt&#39;       =>  $suffix
                ]],[
                    &#39;file.fileSize&#39; =>  &#39;上传的文件大小不能超过&#39;.$size.&#39;M&#39;,
                    &#39;file.fileExt&#39;  =>  &#39;请上传后缀为:&#39;.$suffix.&#39;的文件&#39;
                ])->check([&#39;file&#39;=>$file]);

                //上传文件到本地服务器
                $filename = \think\facade\Filesystem::disk(&#39;public&#39;)->putFile($upload_dir, $file);
                if ($filename){
                    $src = &#39;/uploads/&#39;.$filename;
                    return json([&#39;code&#39;=>1,&#39;result&#39;=>$src]);
                }else{
                    return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;上传失败&#39;]);
                }
            }catch (ValidateException $e){
                return json([&#39;code&#39;=>0,&#39;msg&#39;=>$e->getMessage()]);
            }
        }else{
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;非法请求&#39;]);
        }
    }

    //删除旧图片
    public function delImg()
    {
        if (request()->isPost() && request()->isAjax()){
            //获取旧图片地址
            $img_url = input(&#39;img_url&#39;,&#39;&#39;,&#39;trim&#39;);
            //如果旧图片地址为系统默认图片地址直接返回true; 这里的系统默认地址小伙伴可以自行设置
            if($img_url == &#39;/uploads/image/avatar/default/user_avatar.jpg&#39;){
                return true;
            }
            //ROOT_PATH常量建议定义在入口文件index.php或中间件中,这里为了演示方便就先定义在这里。
            define(&#39;ROOT_PATH&#39;,dirname(str_replace("\\",&#39;/&#39;,$_SERVER[&#39;SCRIPT_FILENAME&#39;]))."/");
            //如果接收的图片地址不为空,循环删除
            if (!empty($img_url)){
                $old_image = array(ROOT_PATH.$img_url);
                foreach ($old_image as $img){
                    if (file_exists($img)){
                        @unlink($img);
                    }
                }
            }
            return json([&#39;code&#39;=>1,&#39;msg&#39;=>&#39;图片删除成功&#39;]);
        }else{
            return json([&#39;code&#39;=>0,&#39;msg&#39;=>&#39;图片删除失败&#39;]);
        }
    }
}
登入後複製

8.2、在common.js中的common_upload()方法中定义before()

/**
 * @desc 通用文件上传
 * @param name  文件存储文件夹
 * @param type 文件类型:默认为图片类型(image)
 */
function common_upload(name,type=&#39;image&#39;) {

    layui.use([&#39;form&#39;, &#39;upload&#39;], function() {
        var upload = layui.upload;

        //选完文件后自动上传
        upload.render({
            elem: &#39;#&#39;+name,
            url: "/upload/upload",
            auto: true,
            accept: &#39;file&#39;, //普通文件
            data:{name:name,type:type},

            before: function(obj) {
                var img_url = $(&#39;input[name=&#39;+name+&#39;]&#39;).val();
                // 删除老数据
                if (img_url != &#39;&#39;) {
                    $.ajax({
                        url: "/upload/delImg",
                        type: &#39;POST&#39;,
                        data: {
                            img_url: img_url
                        },
                    });
                }
            },

            done: function(data) {
                console.log(data);
                //上传完毕回调
                if (data.code == 0) {
                    return layer.msg(data.msg,{icon:2});
                } else {
                    $("#"+name+"_thumb").attr(&#39;src&#39;,data.result).show();
                    $(&#39;input[name=&#39;+name+&#39;]&#39;).val(data.result);
                }
            }
        });
    });
}
登入後複製

相关推荐:

1. thinkphp技术专题

2. thinkphp视频教程

以上是封裝ThinkPHP6.0通用檔案上傳的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

可以刪除Tmp格式檔案嗎? 可以刪除Tmp格式檔案嗎? Feb 24, 2024 pm 04:33 PM

Tmp格式檔案是一種暫存檔案格式,通常由電腦系統或程式在執行過程中產生。這些文件的目的是儲存臨時數據,以幫助程式正常運行或提高效能。一旦程式執行完成或電腦重啟,這些tmp檔案往往就沒有了存在的必要性。所以,對於Tmp格式檔案來說,它們本質上是可以刪除的。而且,刪除這些tmp檔案能夠釋放硬碟空間,確保電腦的正常運作。但是,在刪除Tmp格式檔案之前,我們需

出現0x80004005錯誤代碼怎麼辦 小編教你0x80004005錯誤代碼解決方法 出現0x80004005錯誤代碼怎麼辦 小編教你0x80004005錯誤代碼解決方法 Mar 21, 2024 pm 09:17 PM

在電腦中刪除或解壓縮資料夾,時有時會彈出提示對話框“錯誤0x80004005:未指定錯誤”,如果遇到這中情況應該怎麼解決呢?提示錯誤碼0x80004005的原因其實很多,但大部分因為病毒導致,我們可以重新註冊dll來解決問題,下面,小編給大夥講解0x80004005錯誤代碼處理經驗。有使用者在使用電腦時出現錯誤代碼0X80004005的提示,0x80004005錯誤主要是由於電腦沒有正確註冊某些動態連結庫文件,或電腦與Internet之間存在不允許的HTTPS連接防火牆所引起。那麼如何

夸克網盤的檔案怎麼轉移到百度網盤? 夸克網盤的檔案怎麼轉移到百度網盤? Mar 14, 2024 pm 02:07 PM

  夸克網盤和百度網盤都是現在最常用的儲存文件的網盤軟體,如果想要將夸克網盤內的文件保存到百度網盤,要怎麼操作呢?本期小編整理了夸克網盤電腦端的檔案轉移到百度網盤的教學步驟,一起來看看是怎麼操作吧。  夸克網盤的檔案怎麼存到百度網盤?要將夸克網盤的文件轉移到百度網盤,首先需在夸克網盤下載所需文件,然後在百度網盤用戶端中選擇目標資料夾並開啟。接著,將夸克網盤中下載的檔案拖放到百度網盤用戶端開啟的資料夾中,或使用上傳功能將檔案新增至百度網盤。確保上傳完成後在百度網盤中查看檔案是否已成功轉移。這樣就

thinkphp專案怎麼運行 thinkphp專案怎麼運行 Apr 09, 2024 pm 05:33 PM

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

hiberfil.sys是什麼檔案? hiberfil.sys可以刪除嗎? hiberfil.sys是什麼檔案? hiberfil.sys可以刪除嗎? Mar 15, 2024 am 09:49 AM

  最近有很多網友問小編,hiberfil.sys是什麼文件? hiberfil.sys佔用了大量的C碟空間可以刪除嗎?小編可以告訴大家hiberfil.sys檔是可以刪除的。下面就來看看詳細的內容。 hiberfil.sys是Windows系統中的隱藏文件,也是系統休眠文件。通常儲存在C盤根目錄下,其大小與系統安裝記憶體大小相當。這個檔案在電腦休眠時被使用,其中包含了當前系統的記憶體數據,以便在恢復時快速恢復到先前的狀態。由於其大小與記憶體容量相等,因此它可能會佔用較大的硬碟空間。  hiber

斜線和反斜線在檔案路徑中的不同使用 斜線和反斜線在檔案路徑中的不同使用 Feb 26, 2024 pm 04:36 PM

檔案路徑是作業系統中用於識別和定位檔案或資料夾的字串。在檔案路徑中,常見的有兩種符號分隔路徑,即正斜線(/)和反斜線()。這兩個符號在不同的作業系統中有不同的使用方式和意義。正斜線(/)是Unix和Linux系統中常用的路徑分隔符號。在這些系統中,檔案路徑是以根目錄(/)為起始點,每個目錄之間使用正斜線進行分隔。例如,路徑/home/user/Docume

thinkphp有幾個版本 thinkphp有幾個版本 Apr 09, 2024 pm 06:09 PM

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

See all articles