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日

相关文章

  • jQWidgets jqxWindow maxHeight属性

    关于jQWidgets jqxWindow组件的maxHeight属性,我来给您详细讲解一下。 1. maxHeight属性是什么 maxHeight是jQWidgets jqxWindow组件的一个属性,它是一个用来指定窗口最大高度的数字。当窗口高度超过最大高度时,会出现滚动条,避免窗口高度超出屏幕而无法显示。 具体属性定义如下: //HTML <d…

    jquery 2023年5月12日
    00
  • 基于JQuery和DWR实现异步数据传递

    实现基于jQuery和DWR的异步数据传递可以分为以下几个步骤: 集成jQuery和DWR jQuery和DWR分别是两个独立的库,需要将它们同时引入到项目中。可以通过CDN或者下载到本地并进行引入,如下所示: <script src="https://cdn.jsdelivr.net/jquery/3.6.0/jquery.min.js&q…

    jquery 2023年5月27日
    00
  • 如何使用jQuery获得一个元素相对于文档或父级的位置

    使用jQuery获得一个元素相对于文档或父级的位置通常可以通过jQuery的offset()、position()和scrollTop()方法来实现。下面是一些详细的讲解和实际示例。 使用offset()方法获取元素相对于文档的位置 offset()方法可以获取一个元素相对于文档的位置(即它的左上角顶点相对于文档左上角顶点的距离)。使用该方法可以通过以下代码…

    jquery 2023年5月12日
    00
  • jQuery UI Sortable refresh() 方法

    jQuery UI 的 Sortable 组件提供了一个 refresh() 方法,该方法用于刷新 Sortable 实例中的元素。在本教程中,我们将详细介绍 Sortable 的 refresh() 方法的使用方法。 refresh() 方法基本语法如下: $( ".selector" ).sortable( "refresh…

    jquery 2023年5月11日
    00
  • Jquery之datagrid查询详解

    Jquery之datagrid查询详解 1. 简介 jQuery EasyUI Datagrid是一个灵活的、易于使用的数据表格控件。它具有分页、排序、过滤、选中、编辑和行内添加/编辑/删除等功能。本文将详细讲解jQuery EasyUI Datagrid的查询功能。 2. 数据源 在jQuery EasyUI Datagrid中,可以通过设置其”Toolb…

    jquery 2023年5月28日
    00
  • jquery 选取方法都有哪些

    jQuery是一种流行的JavaScript库,提供了各种功能,如DOM操作,事件处理和AJAX。其中,最常用的功能可能就是选取元素了。下面是jQuery中常用的选取方法: 1. 通过标签名选取元素 使用jQuery选择器可以选择文档中的一个或多个标签。例如,通过 $(‘p’) 可以选择所有 <p> 标签。 示例代码: // 选取页面中所有的p标…

    jquery 2023年5月27日
    00
  • Jquery 效果使用详解

    Jquery 效果使用详解 1. 概述 在网页设计和开发中,Jquery 是一个非常流行的 JavaScript 库,被广泛使用于各种网页动态效果中。本篇文章将详细讲解 Jquery 的各种效果使用方法,包括但不限于: 滑动效果 渐变效果 鼠标事件 CSS 操作 2. 滑动效果 2.1 滑动隐藏和显示 Jquery 提供了 slideUp 和 slideDo…

    jquery 2023年5月27日
    00
  • jQWidgets jqxChart toolTipHideDelay 属性

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxChart,它是用于绘制图表的组件。jqxChart 提供多个属性,其中之一是 toolTipHideDelay。下面是关于 jqxChart 的 toolTipHideDelay 属性的详细攻略: toolTipHideDelay 属性概…

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