tp5使用layui实现多个图片上传(带附件选择)的方法实例

标题:tp5使用layui实现多个图片上传(带附件选择)的方法实例

在TP5中,结合layui组件可以非常方便地实现多个图片上传的功能。本文详细介绍了该功能的实现方法,包括附件选择、图片预览等功能。

一、引入layui组件

在TP5中,我们可以通过composer集成layui组件,需要在composer.json文件中添加以下代码:

"require": {
    "topthink/think-layui": "^1.1"
}

然后在终端执行 composer update 命令进行更新。

二、前端实现

在前端页面中,我们需要引入layui的JavaScript和CSS文件,同时需要谨慎的设置HTML结构。示例如下:

<div class="layui-upload">
    <button type="button" class="layui-btn layui-btn-sm" id="testList">选择图片</button>
    <div class="layui-upload-list">
        <table class="layui-table">
            <thead>
            <tr>
                <th>文件名</th>
                <th>大小</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody id="demoList"></tbody>
        </table>
        <input type="hidden" name="images">
    </div> 
</div>

这里,我们定义了一个用于显示上传图片列表的表格,其中包含了文件名、大小、状态和操作等列。同时还设置了一个隐藏域用来保存上传成功后的图片地址。

接下来,在JavaScript中,我们需要定义一个上传组件并初始化:

layui.use(['upload'], function () {
    var upload = layui.upload;

    //执行实例
    var uploadInst = upload.render({
        elem: '#testList',
        url: '<?php echo url("admin/upload/uploadImages"); ?>',
        multiple: true,
        acceptMime: 'image/*',
        auto: false,
        bindAction: '#uploadImages',
        choose: function (obj) {
            var files = obj.pushFile();
            //预读图片信息
            obj.preview(function (index, file, result) {
                console.log(index);
                console.log(file);
                console.log(result);
                var tr = $(['<tr id="upload-' + index + '"><td>' + file.name + '</td>',
                    '<td>' + file.size / 1024 + 'kb</td>',
                    '<td>等待上传</td>',
                    '<td><button type="button" class="btn btn-danger btn-xs demo-delete"><i class="glyphicon glyphicon-trash"></i>删除</button></td>',
                    '</tr>'].join(''));

                // 单个重传
                tr.find('.demo-reload').on('click', function () {
                    obj.upload(index, file);
                });

                //删除
                tr.find('.demo-delete').on('click', function () {
                    delete files[index];
                    tr.remove();
                });

                $('#demoList').append(tr);
            });
        },
        done: function (res, index, upload) {
            if (res.code === 0) { //上传成功
                $('#upload-' + index).html('<td>' + res.data.original_name + '</td><td>' + res.data.file_size + 'KB</td><td>上传成功</td>');
                $("input[name='images']").val($("input[name='images']").val() + "," + res.data.url);
            } else {
                layer.msg('上传失败!', {
                    icon: 5,
                    time: 2000
                });
            }
        },
        error: function (index, upload) {
            layer.msg('上传失败!', {
                icon: 5,
                time: 2000
            });
        }
    });
});

在这个上传组件中,我们定义了以下配置项:

  • elem:指定上传按钮的ID,即选择图片的按钮;
  • url:指定上传图片的后台接口地址;
  • multiple:是否允许同时上传多张图片;
  • acceptMime:指定允许上传的图片格式;
  • auto:是否在选择图片后自动上传;
  • bindAction:指定提交按钮的ID,即上传按钮,这里是将上传图片的根据选择后的图片上传至服务器;
  • choose:选择图片后的回调函数,可以在此函数中预读图片信息并进行显示;
  • done:上传成功后的回调函数,可以在此函数中保存上传成功后的图片地址;
  • error:上传失败后的回调函数,可以在此函数中进行异常处理。

其中,关键代码如下:

var uploadInst = upload.render({
    elem: '#testList',
    url: '<?php echo url("admin/upload/uploadImages"); ?>',
    multiple: true,
    acceptMime: 'image/*',
    auto: false,
    bindAction: '#uploadImages',
    choose: function (obj) {
        var files = obj.pushFile();
        //预读图片信息
        obj.preview(function (index, file, result) {
            var tr = $(['<tr id="upload-' + index + '"><td>' + file.name + '</td>',
                '<td>' + file.size / 1024 + 'kb</td>',
                '<td>等待上传</td>',
                '<td><button type="button" class="btn btn-danger btn-xs demo-delete"><i class="glyphicon glyphicon-trash"></i>删除</button></td>',
                '</tr>'].join(''));

            //删除
            tr.find('.demo-delete').on('click', function () {
                delete files[index];
                tr.remove();
            });

            $('#demoList').append(tr);
        });
    },
    done: function (res, index, upload) {
        if (res.code === 0) { //上传成功
            $('#upload-' + index).html('<td>' + res.data.original_name + '</td><td>' + res.data.file_size + 'KB</td><td>上传成功</td>');
            $("input[name='images']").val($("input[name='images']").val() + "," + res.data.url);
        } else {
            layer.msg('上传失败!', {
                icon: 5,
                time: 2000
            });
        }
    },
    error: function (index, upload) {
        layer.msg('上传失败!', {
            icon: 5,
            time: 2000
        });
    }
});

三、后端实现

在后台控制器中,我们需要定义一个用于接收图片上传请求的接口函数:

/**
 * 处理图片上传
 */
public function uploadImages()
{
    $images = request()->file('file');
    $data   = [];
    foreach ($images as $file) {
        $path        = 'upload/images/';
        $fileInfo    = $file->move($path);
        if ($fileInfo) {
            //保存数据到数组
            $data[] = [
                'url'           => $path . $fileInfo->getSaveName(),
                'original_name' => $fileInfo->getInfo('name'),
                'file_size'     => $fileInfo->getInfo('size') / 1024
            ];
        }
    }
    $result = ['code' => 0, 'msg' => '上传成功', 'data' => $data];
    return json_encode($result);
}

在这里我们利用TP5自带的Request类的 file() 方法获取上传的所有文件,然后对每个文件进行处理并返回数据。

完成以上操作,就可以让多个图片上传上传的功能实现。如果你想加强图片浏览功能,你也可以参考layui的图片预览组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tp5使用layui实现多个图片上传(带附件选择)的方法实例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • jQuery UI Datepicker beforeShowDay选项

    下面是关于“jQuery UI Datepicker beforeShowDay选项”的详细讲解。 什么是 beforeShowDay 选项? beforeShowDay是jQuery UI Datepicker控件中的一个选项,它允许您指定一个函数来自定义日期的可用性和外观。在弹出日期选择器之前,beforeShowDay函数将会对每个日期应用,并决定是否…

    jquery 2023年5月12日
    00
  • jQuery focusout()方法

    jQuery focusout()方法用于在元素失去焦点时绑定一个或多个事件处理程序。该方法类似于jQuery on()方法但是它只在元素失去焦点时触发事件处理程序。 以下是jQuery focusout()方法的详细攻略: 语法 $(selector).focusout(handler) ` ## 参数 – `selector`:必需,用于选择要绑定事件的…

    jquery 2023年5月9日
    00
  • 浅谈Jquery中Ajax异步请求中的async参数的作用

    当在Jquery中使用Ajax进行异步请求时,async参数是一个重要的参数之一。async参数控制了请求是否是异步的。这个参数的默认值为true,意味着异步请求。在这篇文章中,我们将探讨async参数的作用以及使用异步和同步请求的场景。 什么是Ajax异步请求 在进行Ajax异步请求时,浏览器不会停止用户在网页中的操作,而是在后台发起请求。当请求完成,将执…

    jquery 2023年5月27日
    00
  • Jquery实现跨域异步上传文件总结

    下面是关于“Jquery实现跨域异步上传文件”的详细攻略。 什么是跨域及其实现原理 首先,我们要了解下什么是跨域(Cross-domain),顾名思义就是不同域名或不同端口之间的数据或请求传输。 在HTTP协议中,浏览器工作的原理是在同源策略(Same-Origin Policy)下,只能发送同一源下的请求(同一协议、同一IP地址、同一端口号),而不能跨域发…

    jquery 2023年5月27日
    00
  • 如何用jQuery设置元素的背景色

    设置元素的背景色是网页设计中常见的需求之一,jQuery是一个流行的JavaScript库,可以帮助我们实现快捷、灵活的网页交互效果,下面是使用jQuery设置元素背景色的攻略: 1. 使用css()方法 使用css()方法可以直接修改元素的CSS属性值,进而实现调整背景色的目的。可以使用如下方式来设置元素的背景颜色: $(document).ready(f…

    jquery 2023年5月12日
    00
  • jQuery UI选择菜单禁用选项

    jQuery UI选择菜单禁用选项攻略 jQuery UI选择菜单是一个强大的JavaScript库,它提供了许多选项和功能,以便创建自定义的选择菜单。其中,禁用选项用于禁用选择菜单中的某些选项。以下是详细攻略,含两个示例,演示如何使用禁用选项: 步骤1:引入库 在使用之前,需要先在中引入jQuery库和jQuery UI库。可以通过以下方式引入: <…

    jquery 2023年5月9日
    00
  • jQWidgets jqxButtonGroup按钮点击事件

    jQWidgets jqxButtonGroup按钮点击事件详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包jqxButtonGroup是其中之一。本文将详细介绍jqxButtonGroup的按钮点击事件,包括定义、语法和示例。 按钮点击事件的定义 jqxButtonGroup的按钮点击事件是指当用户单击按钮时触发的事件。…

    jquery 2023年5月10日
    00
  • jQuery实现html table行Tr的复制、删除、计算功能

    下面我将为你详细讲解”jQuery实现html table行Tr的复制、删除、计算功能”的完整攻略。 1.需求分析 首先,我们需要明确需求,实现的功能包括三个方面:行Tr的复制、删除和计算。 行Tr的复制:可以点击一个按钮,复制当前行的所有表单元素; 行Tr的删除:可以删除指定行; 计算功能:当表格中的数据发生变化时,自动计算总和,显示在文本框中。 2. 前…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部