springmvn+layui+文件上传

layui是一款比较适合后端程序员直接上手得前端框架,页面css效果不错而且各类弹框、上传、日期、表格、图标、表单、标签等一系列组建都相当不错。开箱即用!这篇文章记录一下layui上传文件得组建分享一下:

首先撸一下前端代码:

<div class="layui-col-xs6">
    <div class="grid-demo">
        <form class="layui-form" onsubmit="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">&#xe62f;</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">&#x1005;</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 = $(['<tr id="upload-'+ index +'">'
                        ,'<td>'+ file.name +'</td>'
                        ,'<td>'+ fileSize +'kb</td>'
                        ,'<td>等待上传</td>'
                        ,'<td>'
                        ,'<button class="layui-btn layui-btn-mini img-reload layui-hide">重传</button>'
                        ,'<button class="layui-btn layui-btn-mini layui-btn-danger img-delete">删除</button>'
                        ,'</td>'
                        ,'</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('<span style="color: #5FB878;">上传成功</span>');
                    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("重新上传<span class=\'layui-badge layui-bg-gray\'><i class=\'layui-icon\'>&#x1005;</i></span>")
            }
        })

不要忘记引入layui得组件:var upload = layui.upload


后台:

//多文件上传
    @RequestMapping(value="/uploadFile",method = RequestMethod.POST)
    @ResponseBody
    public Map<String,String> uploadImageFile(UploadFile uploadfile, HttpServletRequest request, HttpServletResponse response) throws Exception{
        //获取上传的额外参数
        String orderNo = request.getParameter("orderNo");
        // TODO Auto-generated method stub
        Map<String,String> 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<String> 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")
public String receive(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart)
throw new IllegalArgumentException(
"上传内容不是有效的multipart/form-data类型.");
 
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
 
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
 
// Parse the request
List<?> items = upload.parseRequest(request);
 
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
// 如果是普通表单字段
String name = item.getFieldName();
String value = item.getString();
// ...
} else {
// 如果是文件字段
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();

String filePath=STORE_FILE_DIR+fileName;
//写入文件到当前服务器磁盘
File uploadedFile = new File(filePath);
// File uploadedFile = new File("D:\haha.txt");
item.write(uploadedFile);
}
}
response.setCharacterEncoding("UTF-8");  
response.getWriter().println("上传成功");
return null;
}

到此。这是我在项目中用到的文件上传的实际业务需求。另外一段代码就是我把照片传到我的服务器上。别人如果想法问怎么办?这个时候一般两种办法解决。一种直接把照片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);
    List<UploadFile> list = 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是文件的逻辑名称!





猜你喜欢

转载自blog.csdn.net/liyingying111111/article/details/80843418