文件上传 multipart

允许用户利用multipart请求将本地文件上传到服务器,是Spring MVC其中的一个优势。它提供了Multipart一系列api方便了文件的上传
Spring通过对Servlet API的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest

首先 前端提交的表单中如果包含文件 ,需要采用post 方式 ,enctype要设置为multipart/form-data ,这种方式不对字符进行编码,支持文件上传。


Spring 文件上传API spring.framework.web.multipart

文件上传 multipart_第1张图片
multipart包结构

文件上传 multipart_第2张图片
multipart包常用类与接口

SpringMVC 文件上传过程:

1. 配置MultipartResolver,该接口有两个实现,如图。(也可以通过在controller中配置MultipartResolver进行实现!http://blog.csdn.net/awangz/article/details/9471161)

可通过defaultEncoding设置编码方式;通过maxUploadSize设置大小限制;可通过uploadTempDir设置存储路径。

2.写表单 注意enctype=multipart/form-data.
3.写文件上传控制类

关键代码:new MultipartFile 先new该对象 在调用其 .transferTo(new File(path目标存储路径))
关键点:可用RequestParam绑定参数MultipartFile [] 到控制器方法参数;也可HttpServletRequest获取
特点:相比输入输出流,传输的更快

坑:DispacherServlet中已经固定了MultipartResolver的id=multipartResolver不可修改

源码分析 原理解析

  • Spring multipart继承于Apache common upload,其代码实现都是调用Apache的文件上传类与方法实现的,multipart上传其内部是调用apache的上传组件DeferredFileOutputStream实现的。
  • DeferredFileOutputStream又封装着MultipartStream流,MultipartStream提供对客户端传来的multipart文件类型数据的处理方法。
  • 客户端提供的multipart文件是分区块的,一个请求中若enctype采用multipart类型MIME编码,则传输的文件不对字符编码,传输的数据按readBoundary()取得的分界符进行分隔,每个区段对应表单的一个input,其中有content-type字段的区段是文件数据,服务器端调用MultipartStream的readHeader()、readBodyData()方法,获取字段中数据。再看MultipartStream其中源码,其实也就是用输入输出流实现的。

demo:

xml
  
  
controller

    /*lyy 文件上传  学习 multipart 
     * 2016-11-4
     * 
     * */
    @RequestMapping(params = "doAdd2",method = RequestMethod.POST)
    public ModelAndView doAddFiles(BookInfoEntity bookInfo, HttpServletRequest request, @RequestParam("files") MultipartFile[] files) throws ParseException {   
        
        if (StringUtil.isNotEmpty(bookInfo.getId())) {
            BookInfoEntity t = bookInfoService.get(BookInfoEntity.class, bookInfo.getId());
            try {
                MyBeanUtils.copyBeanNotNull2Bean(bookInfo, t);
                bookInfoService.saveOrUpdate(t);
            } catch (Exception e) {
                e.printStackTrace();
            
            }
        } else {
            if(bookInfo.getBookImage()==null){
                bookInfo.setBookImage("images/book_images/book1.JPG");
            }
            String bookName="";
            try {
                //bookName = new String(bookInfo.getBookName().getBytes("ISO-8859-1"), "UTF-8");
                bookName = java.net.URLDecoder.decode(bookInfo.getBookName(), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            bookInfo.setBookName(bookName);
            bookInfo.setAuditStatus(1);
            bookInfo.setBookAuditor("8a4eb0c8569b66f401569b8412900004");
            bookInfo.setCreateBy("8a4eb0c8569b66f401569b8412900004");
            bookInfo.setIsenable(1);
            Date currentTime = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(currentTime);  
            //图片上传


            
            //多文件上传
            //判断file数组不能为空且长度大于0
            if(files!=null&&files.length>0){
                //循环获取file数组中文件
                for(int i=0;i
jsp
 
采用 MultipartHttpServletRequest request获取文件
public ModelAndView doAdd(BookInfoEntity bookInfo, MultipartHttpServletRequest request) throws ParseException { 


//图片上传
            Iterator itrImage = request.getFileNames();
            MultipartFile mpf = null;
            String fileName="";
            String[] fileNameAll={"未命名","jpg"};
            while (itrImage.hasNext()){
                mpf=request.getFile(itrImage.next());
                if(!StringUtil.isEmpty(fileName)){
                    fileNameAll=fileName.split("\\.");
                }else{
                    fileNameAll[0]="未命名";
                }
                try {
                    //String path = "images/book_images/";
                    //String realPath = request.getSession().getServletContext().getRealPath("/") +"/"+ path+"/";// 文件的硬盘真实路径
                    String realPath="D:\\ImageFiles\\book_images\\";
                    String newFileName;
                    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                    newFileName =bookName+df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileNameAll[1];                  
                    String savePath = realPath +newFileName;// 文件保存全路径
                    savePath = java.net.URLDecoder.decode(savePath, "UTF-8");
                    FileCopyUtils.copy(mpf.getBytes(), new File(savePath));
                    bookInfo.setBookImage(newFileName);                 
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

暂时不用的图片们:


文件上传 multipart_第3张图片
multipart继承关系

文件上传 multipart_第4张图片
multipart包结构

你可能感兴趣的:(文件上传 multipart)