最近需要做一个批量上传图片的功能,为丰富前端框架的拓展学习使用,这次打算用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"></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
版权声明:本文为博主原创文章,转载请附上博文链接!