Layui+SpringMVC实现图片批量上传

最近需要做一个批量上传图片的功能,为丰富前端框架的拓展学习使用,这次打算用layui前端框架实现,源码放在文章底部,废话不多说,先上演示效果

执行前:

操作后:

一、导入对应的layui样式及其资源文件
1.引入对应的css及其js文件

2.编辑上传的页面

3.上传文件的js配置

<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/layui/css/layui.css">
<script src="${pageContext.request.contextPath}/resources/js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath}/resources/layui/layui.js"></script>
 
<!-- 内容主体区域  表单内容 -->
<form class="layui-form goodsAddForm" action="" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">商品名称</label>
        <div class="layui-input-block">
            <input type="text" name="title" id="title" required lay-verify="required" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
        </div>
    </div>
    
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">商品副标题</label>
        <div class="layui-input-block">
            <textarea name="smallTit" id="smallTit" placeholder="商品副标题:" class="layui-textarea"></textarea>
        </div>
    </div>
 
    <div class="layui-form-item">
        <label class="layui-form-label">商品图片上传</label>
        <div class="layui-input-block">
            <button type="button" class="layui-btn" id="test1">
                <i class="layui-icon">&#xe67c;</i>选择图片(最多选择20张,单张图片最大为10M)
            </button>
            <button type="button" class="layui-btn" id="test9">开始上传</button>
            <button type="button" class="layui-btn" id="cleanImgs"> <i class="fa fa-trash-o fa-lg"></i>清空图片预览</button>
        </div>
        <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
            预览图:
            <div class="layui-upload-list" id="demo2"></div>
        </blockquote>
    </div>
    
    <input type="text" id="imgUrls" name="imgUrls" style="display: none;" class="layui-input">
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" type="button" style="width: 800px;" id="btnSubmit">添加商品</button>
        </div>
    </div>
</form>
/**
 * 图片上传数量及其大小等控制
 * 点击开始上传按钮(test9),执行上传
 * 
 */
var success=0;
var fail=0;
var imgurls="";
 
$(function (){
    var imgsName="";
    layui.use(['upload','layer'],function() {
        var upload = layui.upload;
        var layer=layui.layer;
 
        upload.render({
            elem: '#test1',
            url: '/upload',
            multiple: true,
            auto:false,
//            上传的单个图片大小
            size:10240,
//            最多上传的数量
            number:20,
//            MultipartFile file 对应,layui默认就是file,要改动则相应改动
            field:'file',
            bindAction: '#test9',
            before: function(obj) {
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result) {
                    $('#demo2').append('<img src="' + result 
                        + '" alt="' + file.name 
                        +'"height="92px" width="92px" class="layui-upload-img uploadImgPreView">')
                });
            },
            done: function(res, index, upload) {
                //每个图片上传结束的回调,成功的话,就把新图片的名字保存起来,作为数据提交
                console.log(res.code);
                if(res.code=="1"){
                    fail++;
                }else{
                    success++;
                    imgurls=imgurls+""+res.data.src+",";
                    $('#imgUrls').val(imgurls);
                }
            },
            allDone:function(obj){
                layer.msg("总共要上传图片总数为:"+(fail+success)+"\n"
                            +"其中上传成功图片数为:"+success+"\n"
                            +"其中上传失败图片数为:"+fail
                         )
            }
        });
 
    });
    
    //清空预览图片
    cleanImgsPreview();
    //保存商品
    goodsSave();
});
 
/**
 * 清空预览的图片及其对应的成功失败数
 * 原因:如果已经存在预览的图片的话,再次点击上选择图片时,预览图片会不断累加
 * 表面上做上传成功的个数清0,实际后台已经上传成功保存了的,只是没有使用,以最终商品添加的提交的为准
 */
function cleanImgsPreview(){
    $("#cleanImgs").click(function(){
        success=0;
        fail=0;
        $('#demo2').html("");
        $('#imgUrls').val("");
    });
}
 
/**
 * 保存商品
 */
function goodsSave(){
    $('#btnSubmit').click(function(){
        var tt=$("#title").val();
        var st=$("#smallTit").val();
        var ius=$("#imgUrls").val();
    
        $.ajax({
               type: "POST",
               url: "/saveGoods",
               data: {
                   title:tt,
                   smallTit:st,
                   imgUrls:ius,
               },
               success: function(msg){
                   if(msg=="1"){
                       alert("保存成功");
                   }else{
                       alert("保存失败");
                   }
               }
        });
    });
}
二、图片上传Controller
注意:你要在springMVC配置文件配置springMVC的图片上传bean以及开放静态资源的访问

    <context:component-scan base-package="csdn.liuxuquan.controller"/>
    <mvc:annotation-driven/>
    <!-- 静态资源处理, css, js, imgs -->
    <mvc:resources mapping="/resources/**" location="/resources/"/>
 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- SpringMVC文件上传规定需配置 MultipartResolver处理器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" />
        <!-- 指定所上传文件的总大小,单位字节。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
        <property name="maxUploadSize" value="10485760" />
    </bean>
图片名称请不要重复,这里使用UUID,如果图片保存全路径名xx/xx/xx.png重复,请想想会有什么问题?  会造成图片覆盖!
    @SuppressWarnings("deprecation")
    @RequestMapping("/upload")
    @ResponseBody
    public ImgResult uplpad(MultipartFile file, HttpServletRequest request) {
        String desFilePath = "";
        String oriName = "";
        ImgResult result = new ImgResult();
        Map<String, String> dataMap = new HashMap<>();
        ImgResult imgResult = new ImgResult();
        try {
            // 1.获取原文件名
            oriName = file.getOriginalFilename();
            // 2.获取原文件图片后缀,以最后的.作为截取(.jpg)
            String extName = oriName.substring(oriName.lastIndexOf("."));
            // 3.生成自定义的新文件名,这里以UUID.jpg|png|xxx作为格式(可选操作,也可以不自定义新文件名)
            String uuid = UUID.randomUUID().toString();
            String newName = uuid + extName;
            // 4.获取要保存的路径文件夹
            String realPath = request.getRealPath("resources/imgs/");
            // 5.保存图片
            desFilePath = realPath + "\\" + newName;
            File desFile = new File(desFilePath);
            file.transferTo(desFile);
            System.out.println(desFilePath);
            // 6.返回保存结果信息
            result.setCode(0);
            dataMap = new HashMap<>();
            dataMap.put("src", "resources/imgs/" + newName);
            result.setData(dataMap);
            result.setMsg(oriName + "上传成功!");
            return result;
        } catch (IllegalStateException e) {
            imgResult.setCode(1);
            System.out.println(desFilePath + "图片保存失败");
            return imgResult;
        } catch (IOException e) {
            imgResult.setCode(1);
            System.out.println(desFilePath + "图片保存失败--IO异常");
            return imgResult;
        }
    }
商品保存Controller:

商品的url以逗号拼接批量图片访问路径,最终访问以ip+图片访问路径进行访问

@Controller
public class GoodsController {
    @ResponseBody
    @RequestMapping(value="saveGoods",method=RequestMethod.POST)
    private String saveImgInfo(String title,String smallTit,String imgUrls){
        /**
         * 你应该在这里做service层的调用
         * 你应该结果返回数据格式如定义返回格式:1代表成功,0代表失败
         * 总之你应该规范
         * 我这里直接返回1,代表成功。
         */
        System.out.println(title);
        System.out.println(smallTit);
        System.out.println(imgUrls);
        String[] urls = imgUrls.split(",");
        for (int i = 0; i < urls.length; i++) {
            System.out.println("图片名称:"+urls[i]);
        }
        return "1";
    }
}

为方便学习,下面是源码,我设置的是最低的积分,我是绝对不想要你这一点积分的:

CSDN:https://download.csdn.net/download/qq_26570353/10293422

码云:https://gitee.com/liuxuquan/Demo/tree/master
--------------------- 
作者:liuxuquan_ 
来源:CSDN 
原文:https://blog.csdn.net/qq_26570353/article/details/79599303 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值