第七节 LayUI实现多图片上传

亮子 2024-07-13 01:50:08 7463 0 0 0

1、后端文件上传接口

    @PostMapping("/upload1")
    @ResponseBody
    public R uploadFile1(HttpServletRequest request, @RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return R.ERROR(500, "上传失败,请选择文件");
        }

        // 准备路径
        String realPath = request.getServletContext().getRealPath("/upload/");
        File path = new File(realPath);
        if(!path.exists()) {
            path.mkdir();
        }

        // 获取上传文件的名称
        String fileName = file.getOriginalFilename();
        String extName = FileNameUtil.extName(fileName);

        // 生产随机文件,防止同名文件覆盖
        String newName = UUID.randomUUID().toString() + "." + extName;
        System.out.println("newName="+newName);

        // 准备目录
        File dest = new File(realPath + newName);
        try {
            // 保存文件
            file.transferTo(dest);

            // 返回上传的文件信息
            String fileUrl = "http://localhost:8080/upload/" + newName;
            return R.OK(fileUrl);

        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.ERROR(500, e.getMessage());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.ERROR(500, e.getMessage());
        }
    }

2、html脚本

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%request.setAttribute("ctx", request.getContextPath());%>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="${ctx}/layui-v2.9.14/css/layui.css">
    <script src="${pageContext.request.contextPath}/layui-v2.9.14/jquery-1.11.3.js"></script>
    <script src="${pageContext.request.contextPath}/layui-v2.9.14/layui.js"></script>
    <script type="text/javascript">
    </script>
    <title>多文件上传测试</title>
</head>
<body>

<button type="button" class="layui-btn" id="ID-upload-demo-btn">
<i class="layui-icon layui-icon-upload"></i> 单图片上传
</button>
<div style="width: 132px;">
    <div class="layui-upload-list">
        <img class="layui-upload-img" id="ID-upload-demo-img" style="width: 100%; height: 92px;">
        <div id="ID-upload-demo-text"></div>
    </div>
    <div class="layui-progress layui-progress-big" lay-showPercent="yes" lay-filter="filter-demo">
        <div class="layui-progress-bar" lay-percent=""></div>
    </div>
</div>

<hr style="margin: 21px 0;">

<div class="layui-upload">
    <button type="button" class="layui-btn" id="ID-upload-demo-btn-2">
        <i class="layui-icon layui-icon-upload"></i> 多图片上传
    </button>
    <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 11px;">
        预览图:
        <div class="layui-upload-list" id="upload-demo-preview"></div>
    </blockquote>
</div>

<script>
    layui.use(function(){
        var upload = layui.upload;
        var layer = layui.layer;
        var element = layui.element;
        var $ = layui.$;
        // 单图片上传
        var uploadInst = upload.render({
            elem: '#ID-upload-demo-btn',
            url: '/index/upload1.do', // 实际使用时改成您自己的上传接口即可。
            before: function(obj){
                // 预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#ID-upload-demo-img').attr('src', result); // 图片链接(base64)
                });

                element.progress('filter-demo', '0%'); // 进度条复位
                layer.msg('上传中', {icon: 16, time: 0});
            },
            done: function(res){
                console.log('upload1', res);
                // 若上传失败
                if(res.code != 200){
                    return layer.msg('上传失败');
                }
                // 上传成功的一些操作
                // …
                $('#ID-upload-demo-text').html(''); // 置空上传失败的状态
            },
            error: function(err){
                console.log('upload1err', err);

                // 演示失败状态,并实现重传
                var demoText = $('#ID-upload-demo-text');
                demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
                demoText.find('.demo-reload').on('click', function(){
                    uploadInst.upload();
                });
            },
            // 进度条
            progress: function(n, elem, e){
                element.progress('filter-demo', n + '%'); // 可配合 layui 进度条元素使用
                if(n == 100){
                    layer.msg('上传完毕', {icon: 1});
                }
            }
        });
        // 多图片上传
        upload.render({
            elem: '#ID-upload-demo-btn-2',
            url: '/index/upload1.do', // 实际使用时改成您自己的上传接口即可。
            multiple: true,
            before: function(obj){
                // 预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#upload-demo-preview').append('<img src="'+ result +'" alt="'+ file.name +'" style="width: 90px; height: 90px;">')
                });
            },
            done: function(res){
                // 上传完毕
                console.log('upload2', res);
            }
        });
    });

</script>
</body>
</html>