基于Spring CommonsMultipartResolver批量上传文件

来源:互联网 发布:oracle有mac版吗 编辑:程序博客网 时间:2024/06/05 04:32

实现上传文件的方法有很多,以下介绍基于Spring CommonsMultipartResolver的方式实现批量上传文件。
HTML页面中的表单最初所采用application/x-www-form-urlencode编码方式,并不满足文件上传的需要。所以RFC 1867在此基础之上增加了新的multipart/form-data编码方式以支持基于表单的文件上传。通常情况下,按照如下格式声明表单以及表单中的元素:

<form id="upload" name="upload" action="/Demo/upload/multiUploadFile.do" enctype="multipart/form-data" method="post">        <input type="file" name="file">        <input type="submit" value="上传文件 " class="button"></form>

表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据。

客户端浏览器将按照RFC 1867所规定的格式对提交表单内容进行编码,服务器端只需要根据RFC 1867规定的格式对请求中的信息进行解码,就可以获得客户端表单提交的数据,包括上传的文件。但既然RFC 1867所规定的规则是固定的,我们就没有必要每次都根据这一规则分析每一次请求中的信息。既然是通用的规则,当然也会有通用的类库,比如早期的jsp smart upload和Oreilly和COS类库,以及现在使用最多的commons fileupload类库。在实际开发中,我们只需要使用这些专门针对表单的文件上传处理类库即可。

jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><script type="text/javascript" src="../common/js/jquery-1.7.2.js"></script><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Multi File Upload</title></head><body><form id="multiUploadForm" name="multiUploadForm" action="/Demo/upload/multiUploadFile.do" enctype="multipart/form-data" method="post">    <div align="center"><br>        <fieldset style="width:90%">            <legend>上传文件</legend><br>            <div class="line">                <div align="left" class="leftDiv">文件1</div>                <div align='left' class="rightDiv">                    <input type="file" name="file1" class="text">                </div>            </div>            <div class='line'>                <div align='left' class="leftDiv">说明1</div>                <div align='left' class="rightDiv"><input type="text" name="description1" class="text"></div>            </div>            <div class='line'>                <div align='left' class="leftDiv">文件2</div>                <div align='left' class="rightDiv">                    <input type="file" name="file2" class="text">                </div>            </div>            <div class='line'>                <div align='left' class="leftDiv">说明2</div>                <div align='left' class="rightDiv"><input type="text" name="description2" class="text"></div>            </div>            <div class='line'>                <div align='left' class="leftDiv"></div>                <div align='left' class="rightDiv"><br/>                    <input type="submit" value="上传文件 " class="button">                </div>            </div>        </fieldset>    </div></form></body></html>

处理上传的Servlet:

@Controller@RequestMapping("/upload")public class UploadController extends HttpServlet {     @RequestMapping("/multiUploadFile.do")    public void multiUploadFile(HttpServletRequest request, HttpServletResponse response) throws IllegalStateException, IOException{        try{            //创建一个通用的解析器              CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());              //判断是否有文件上传              if(commonsMultipartResolver.isMultipart(request)){                  //转换成多部分request                     MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());                MultipartHttpServletRequest multiRequest = resolver.resolveMultipart(request);                Iterator<String> iter = multiRequest.getFileNames();                  while(iter.hasNext()){                      //记录上传过程起始时的时间,用来计算上传时间                      int beginTime = (int) System.currentTimeMillis();                      //取得上传文件                      MultipartFile file = multiRequest.getFile(iter.next());                      if(file != null){                          //取得当前上传文件的文件名称                          String myFileName = file.getOriginalFilename();                          //如果名称不为“”,说明该文件存在,否则说明该文件不存在                          if(myFileName.trim() !=""){                              System.out.println(myFileName);                              //重命名上传后的文件名                              String fileName = "uploadNewFile" + file.getOriginalFilename();                              //定义上传路径                              String path = "D:/" + fileName;                              File localFile = new File(path);                              file.transferTo(localFile);                          }                      }                      //记录上传该文件后的时间                      int finaltime = (int) System.currentTimeMillis();                      System.out.println(finaltime - beginTime);                  }              }             request.getRequestDispatcher("/success.jsp").forward(request, response);        }catch(Exception e){            e.printStackTrace();        }    }}
1 0
原创粉丝点击