layui是一款比较适合后端程序员直接上手得前端框架,页面css效果不错而且各类弹框、上传、日期、表格、图标、表单、标签等一系列组建都相当不错。开箱即用!这篇文章记录一下layui上传文件得组建分享一下:
首先撸一下前端代码:
<div class="layui-col-xs6"> <div class="grid-demo"> <form class="layui-form" οnsubmit="return false;"> <div class="layui-form-item"> <fieldset class="layui-elem-field"> <legend>减免附件legend> <div class="layui-field-box"> <div class="layui-upload"> <button class="layui-btn layui-btn-small layui-btn-radius layui-btn-blue" id="uploadFile">选择文件<span class="layui-badge layui-bg-gray"><i class="layui-icon">i>span>button> <div class="layui-upload-list"> <table class="layui-table"> <thead> <tr> <th>文件名th> <th>大小th> <th>状态th> <th>操作th> tr> thead> <tbody id="imgList">tbody> table> div> div> fieldset> div> <div id="search" class="form-group ml30" style="text-align:center"> <button class="layui-btn layui-btn-small layui-btn-radius layui-btn-blue" id="upLoadFile">上传<span class="layui-badge layui-bg-gray"><i class="layui-icon">စi>span>button> div> form> div> div>
//附件上传 var imgListView = $('#imgList'); var files=null; var mutifile = null; var mutiobj = null; var fileSize = null; //上传图片文件 uploadListIns=upload.render({ elem: '#uploadFile' ,url:'${base}/urgeRepay/uploadFile'//请求url ,method:'post'//提交方式 ,data:{orderNo:orderNo} ,accept:'images'//指定文件类型为图片 ,exts:'jpg|png|gif|bmp|jpeg|doc|docx|gif|pdf' ,auto:false//手动上传 ,bindAction:'#upLoadFile'//上传按钮 ,choose: function(obj){//选择文件后的回调函数 //将每次选择的文件追加到文件队列 files = obj.pushFile(); mutiobj = obj; //预读本地文件,如果是多文件,则会遍历。(不支持ie8/9) obj.preview(function(index, file, result){ fileSize = (file.size/1024).toFixed(1); mutifile = file; // console.log(index);//文件下标 // console.log(file);//上传文件 // console.log(result);//得到文件base64编码,比如图片 var tr = $([''">' ,' '].join('')); //重新上传 tr.find('.img-reload').on('click',function(){ obj.upload(index, file); //对上传失败的单个文件重新上传,一般在某个事件中使用 }) //删除 tr.find('.img-delete').on('click', function(){ delete files[index]; //删除列表中对应的文件,一般在某个事件中使用 tr.remove(); uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选 }); imgListView.append(tr); }); } ,multiple:true//多文件上传 ie8,9不支持, ,size:10240 //KB ,number:3//一次最多3个图片 ,drag:true//支持拖拽 ie8,9不支持, ,done: function(res, index, upload){ fileName+=res.fileName+",";//文件名称 fileSeriName+=res.imgCode+",";//唯一标识 if(res.code == 0){ var tr = imgListView.find('tr#upload-'+ index); tds = tr.children(); tds.eq(2).html('上传成功'); tds.eq(3).html(''); //清空操作 return delete files[index]; //删除文件队列已经上传成功的文件 } //上传成功 mutiobj.upload(index,file); } ,allDone: function(obj){ //当文件全部被提交后,才触发 console.log(obj.total); //得到总文件数 console.log(obj.successful); //请求成功的文件数 console.log(obj.aborted); //请求失败的文件数 } ,error:function(index,upload){ $('#upLoadFile').html("重新上传\'layui-badge layui-bg-gray\'>\'layui-icon\'>စ") } })'+ file.name +' ' ,''+ fileSize +'kb ' ,'等待上传 ' ,'' ,'' ,'' ,' ' ,'
不要忘记引入layui得组件:var upload = layui.upload
后台:
//多文件上传 @RequestMapping(value="/uploadFile",method = RequestMethod.POST) @ResponseBody public MapuploadImageFile(UploadFile uploadfile, HttpServletRequest request, HttpServletResponse response) throws Exception{ //获取上传的额外参数 String orderNo = request.getParameter("orderNo"); // TODO Auto-generated method stub Map resultMap = new HashMap<>(); FileOutputStream out=null; //创建一个通用的多部分解析器 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //获取当前日期 String currDate = CommonUtil.getCurrentDate2(); //判断 request 是否有文件上传,即多部分请求 if(multipartResolver.isMultipart(request)){ //转换成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; //取得request中的所有文件名 Iterator iter = multiRequest.getFileNames(); while(iter.hasNext()){ //取得上传文件 MultipartFile file = multiRequest.getFile(iter.next()); if(file != null){ //取得当前上传文件的文件名称 String myFileName = file.getOriginalFilename(); if(myFileName.lastIndexOf("\\")>0){ myFileName = myFileName.substring(myFileName.lastIndexOf("\\")+1); } //如果名称不为“”,说明该文件存在,否则说明该文件不存在 if(myFileName.trim() !=""){ log.info("文件名称:{}",myFileName); //重命名上传后的文件名 按照年月日时分秒进行命名 String random = CommonUtil.getTimestampRandomNo(5) + Integer.toHexString(new Random().nextInt()); String fileName = random+ myFileName.substring(0,myFileName.lastIndexOf(".")) +"."+ myFileName. substring(myFileName.lastIndexOf(".") + 1); if(org.apache.commons.lang.StringUtils.isEmpty(uploadfile.getFileName())){ uploadfile.setFileName(fileName); } //定义上传路径 try { String filePath=uploadPath+currDate+File.separator;//获取文件保存路径 uploadfile.setFilePath(currDate); uploadfile.setSerialFilename(random); uploadfile.setOrderNo(orderNo); File fileDir=new File(filePath); if (!fileDir.exists()) { //如果不存在 则创建 fileDir.mkdirs(); } String realPath=filePath+fileName; //存文件 File realFile = new File(realPath); out = new FileOutputStream(realFile); out.write(file.getBytes()); // file.transferTo(localFile); resultMap.put("code","0"); resultMap.put("imgCode",random);//唯一标识 resultMap.put("fileName",fileName);//文件名称 entrustUserOrderDaoClient.saveImgFileInfo(uploadfile); } catch (Exception e) { log.error("上传文件异常:{}",e); }finally { out.close(); } } } } } //将图片信息保存的入库 return resultMap;
这里要补充一下:一般文件上传最常用得是common-fileupload.jar 和 common-io.jar
这里用得spring-web集成得jar spring-web-4.3.8.Realese.jar.大同小异。
下面用得是common得jar包的上传文件后台代码,抄的。呵呵。供参考。都大同小异
@RequestMapping("/receive")到此。这是我在项目中用到的文件上传的实际业务需求。另外一段代码就是我把照片传到我的服务器上。别人如果想法问怎么办?这个时候一般两种办法解决。一种直接把照片base64编码把照片文件传过去给对方。另一种就是上传到自己的服务器,给对方提供一个url地址,让其访问。
上传,包括上传图片路径。文件名称。等信息保存入库就不用写了。最后给对方提供一个接口地址。调用该地址可以访问自己服务器的图片。如果要考虑安全,可以发送一个key。服务端验证key.正确再给其访问!
@RequestMapping(value="/getImageFile/{fileSeriName}",method = RequestMethod.GET) public void getImageFile(@PathVariable String fileSeriName, HttpServletResponse response) throws Exception { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_JPEG); UploadFile uploadFile = new UploadFile(); uploadFile.setSerialFilename(fileSeriName); Listlist = messageListDaoClient.findUploadFileAll(uploadFile); if (list != null && list.size() > 0) { UploadFile file = list.get(0); BufferedImage image = ImageIO.read(new FileInputStream(uploadPath + file.getFilePath() + File.separator + file.getFileName())); // 将内存中的图片通过流动形式输出到客户端 ImageIO.write(image, "JPEG", response.getOutputStream()); } return; }
fileSeriName是文件的逻辑名称!