注意Servers配置中限制上传大小
第一步:
HTML页面引入layui
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-normal" 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>
</div>
<!-- <button type="button" class="layui-btn" id="testListAction">开始上传</button> -->
</div>

Ctrl+Shift+F格式化代码(会与输入法简体/繁体快捷键冲突)
第二步:
js中监控Upload
layui.use(['layer', 'form', 'laydate', 'upload' ], function(exports) {});
在监控中编写上传js代码
layui.use(['layer', 'form', 'laydate', 'upload' ], function(exports) {
var baseUpload = new Array();//声明集合存放多个文件 layui.form.on('submit(form-submit)', function(data) { var formObj = data.form; var formData= data.field; formData['stiList'] = baseUpload;//表单提交的时候,把文件也提交过去 $.post(formObj.action, formData, function(result) { if(result.msg == 'OK') { //上传成功 } else { layer.msg(result.msg);//上传失败 } }); return false; }); var url = "saveFile";//这里是上传接口 var demoListView = $('#demoList'),uploadListIns = layui.upload.render({ elem: '#testList' //指向容器选择器 ,url: url //服务端上传接口 ,exts : 'jpg|png|jpeg' //限制上传后缀 ,size : 0 //设置文件最大可允许上传的大小,单位 KB。不支持ie8/9 ,multiple: true //是否允许多文件上传 ,auto: false //是否选完文件后自动上传 如果设定 false,那么需要设置 bindAction //参数来指向一个其它按钮提交上传 ,bindAction: '#testListAction' ,choose: function(obj){ //选择文件后的回调函数 var files = this.files = obj.pushFile(); // 将每次选择的文件追加到文件队列 // 读取本地文件 obj.preview(function(index, file, result){//result为base64(已去除,前内容) var tr = $(['<tr id="upload-'+ index +'">' ,'<td>'+ file.name +'</td>' ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>' ,'<td>等待上传</td>' ,'<td>' ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>' ,'</td>' ,'</tr>'].join('')); var s = { name : file.name,//文件名称 url : "",//存放上传地址 picture : result //上传base64 }; baseUpload.push(s);//放入集合中 // 单个重传 tr.find('.demo-reload').on('click', function(){ obj.upload(index, file); }); // 删除 tr.find('.demo-delete').on('click', function(){ delete files[index]; // 删除对应的文件 baseUpload.splice(files[index],1);//删除集合中 tr.remove(); uploadListIns.config.elem.next()[0].value = ''; // 清空 input file 值, //以免删除后出现同名文件不可选 }); demoListView.append(tr); }); } ,done: function(res, index, upload){//成功后回调函数 if(res.msg == "OK"){ // 上传成功 var tr = demoListView.find('tr#upload-'+ index),tds = tr.children(); tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>'); tds.eq(3).html(''); // 清空操作 var filesrc = res.savePaths;//返回的地址 var filename = res.fileName;//返回的文件名 var s = {//键值对赋值 name : filename,//文件名 url : filesrc//地址路径 /* ,picture : base64 */ //存储base64 }; baseUpload.push(s);//放入集合中 return delete this.files[index]; // 删除文件队列已经上传成功的文件 } this.error(index, upload); } ,error: function(index, upload){ var tr = demoListView.find('tr#upload-'+ index),tds = tr.children(); tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>'); tds.eq(3).find('.demo-reload').removeClass('layui-hide'); // 显示重传 } });

});
第三步:
调用后台接口
spring-context.xml中引入bean
<!-- 上传文件配置 -->
<!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->
<!--defaultEncoding:请求的编码格式必须和用户JSP的编码一致,以便正确读取表单中的内容。
uploadTempDir:文件上传过程中的临时目录,上传完成后,临时文件会自动删除
maxUploadSize:设置文件上传大小上限(单位为字节) -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="102400000" />
</bean>

控制器编写接口:
@RequestMapping(value = "/saveFile3", method = RequestMethod.POST) public void saveFile3(MultipartFile file, Model model) throws IOException { String msg = "OK"; // 判断文件是否存在 if (file == null || StringUtils.isEmpty(file.getOriginalFilename()) || 0 == file.getSize()) { model.addAttribute("msg", "请上传文件!"); return; } // 获取文件名 String fileName = ""; String saveName = ""; // 判断文件夹是否存在, String uploadPath = ContextUtil.getRealPath() + uploadFilePath; File dir = new File(uploadPath); if (!dir.exists() || !dir.isDirectory()) { dir.mkdirs(); } if (file != null) { // 获取文件名 fileName = file.getOriginalFilename(); saveName = getSaveName(fileName); // 文件上传 File localFile = new File(uploadPath + "/" + saveName); file.transferTo(localFile); } // 结果 model.addAttribute("msg", msg); model.addAttribute("savePaths", saveName); model.addAttribute("fileName", fileName); }

本文实则为往数据库中添加base64
后台有实体类集合接受传输过来的baseUpload集合变量
for(Map<String,Object> map : 实体类.get方法){ 实体类 对象 = new 实体类(); 对象.set字段(String.valueOf(map.get("name"))); stiVo.setPicture(String.valueOf(map.get("picture"))); stiVo.setUrl(String.valueOf(map.get("url"))); Service.add();//调用service添加方法 }

插入数据库
第四步:
在HTML页面展示
<div class="layui-fluid" style="overflow: hidden;"> <div class="layui-form-item"> <label class="layui-form-label">附件</label> <div class="layui-input-block" id="fujian"> </div> </div> </div>

当后台调用展示方法时,js判断传递过来的这个实体类存放base64字段是否有值
if (data.listSti != null) {//数据库查询出实体类存放base64不为空时 $('#fujian').html(); var HTML = ""; $.each(data.listSti, function(i, item) {//循环放在变量中 var url = basePath + '/upload/' + item.url; var picture = item.picture;//base64 HTML += "<img class='layui-upload-img' src='"+picture+"' /> ";//直接利用浏览器自带base64即可 }); $('#fujian').append(HTML);//放在页面上 }
