天天看点

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

2018年2月2日

欢迎扫二维码关注公众号,获取技术干货

功能:实现数据与文件同时提交;

【0】之前的博文:​​《SpringMVC(23):使用springmvc+spring+jdbc 优化订单管理系统的示例(单文件上传功能的实现)》​​,提到没有完成数据与文件同时提交的功能,例子如下:

<h4>这是用户添加页面,请在下方输入新的用户信息:</h4>
     method="post" modelAttribute="user" 
        action="${pageContext.request.contextPath}/user/useraddsave" 
        enctype="multpart/form-data">
    <fm:errors path="userCode"></fm:errors>
    用户编码 :<fm:input path="userCode" /><br/>
    <fm:errors path="userName"></fm:errors>
    用户名称 :<fm:input path="userName"/><br/>
    <fm:errors path="userPassword"></fm:errors>
    用户密码 :<fm:password path="userPassword"/><br>
    用户地址 :<fm:input path="address" /><br>
    用户电话 : <fm:input path="phone"/><br>
    <fm:errors path="birthday"></fm:errors>
    用户生日 :<fm:input path="birthday" /><br>
    
    用户性别: <fm:radiobutton path="gender" value="1"/>女
         <fm:radiobutton path="gender" value="2"/>男<br>    
    用户角色 :<br>
          <fm:radiobutton path="userRole" value="101" />OrdinaryUser 
          <fm:radiobutton path="userRole" value="110"/>Administrator<br>
          <fm:radiobutton path="userRole" value="111"/>Manager 
          <fm:radiobutton path="userRole" value="100"/>tour<br>
    证件照:  <input type="file" name="a_idPicPath" id="a_idPicPath" />
    <input type="submit" name="保存"/>
    <input type="reset" value="重置"/>
  </fm:form>      

显示效果:

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

图1

     经过研究,已经解决了该问题:之前不能将数据与文件同时上传,原因是使用了spring提供的标签库,并且在页面<fm:form>标签设置了modelAttribute="user" ,即绑定了模型数据,由此不能识别文件类型数据。

下面分别讲授单文件和多文件与数据模型同时传递的实例:

【1】单文件与数据模型同时传递

View层:

<h5>以下为单文件+其他数据测试</h5>
     <form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
             用户编码 :<input type="text" name="userCode" value=""/><br>
             用户名称 :<input type="text" name="userName" value=""/><br>
      用户密码 :<input type="text" name="userPassword" value=""/><br>
      用户地址 :<input type="text" name="address" value=""/>   <br>
      用户电话 : <input type="text" name="phone" value=""/><br>
      用户生日 :<input type="text" name="birthday" value=""/><br>
      用户性别: <select name="gender" id="gender">
                 <option value="1">女</option>
                 <option value="2" selected="selected">男</option>
            </select><br>
      用户角色 :<select name="userRole" id="userRole">
              <option value="100" selected="selected">tour</option>
              <option value="101">OrdinaryUser</option>
              <option value="110">Administrator</option>
              <option value="111">Manager</option>
            </select><br>
       <input type="hidden" id="errorinfo" value="${uploadFileError}">         
             上传文件:<input type="file" name="uploadFile"/><br/><br/>
         <input type="submit" value="上传"/>
         <input type="reset" value="重置"/>
   </form>      

Controller层:

@RequestMapping(value="/upload" ,method=RequestMethod.POST)
  public String test(User user,HttpSession session ,HttpServletRequest  request,
      @RequestParam(value="uploadFile",required=false) MultipartFile uploadFile) throws Exception, IOException{
    System.out.println("test==");
    String idPicPath = null;
    if(!(uploadFile.isEmpty())){
      System.out.println("begin attaching...");
      //获取保存文件的绝对路径
      String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
      System.out.println("2.1 uploadFile path ===>"+path);
      //获取上传文件的文件名
      String oldFileName = uploadFile.getOriginalFilename();//原文件名
      System.out.println("2.2 uploadFile oldFileName ===>"+oldFileName);
      //获取文件名后缀
      String prefix = FilenameUtils.getExtension(oldFileName);//原文件名后缀
      System.out.println("2.3 uploadFile prefix ===>"+prefix);
      //设置文件大小的变量,KB是单位
      int filesize = 5000000;
      System.out.println("2.4 uploadFile filesize ===>"+uploadFile.getSize());
      if(uploadFile.getSize() > filesize){
        request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
        System.out.println("* 上传大小不得超过5000KB");
        return "useradd";
      }else if(prefix.equalsIgnoreCase("jpg")
             || prefix.equalsIgnoreCase("png")
             || prefix.equalsIgnoreCase("jpeg")
             || prefix.equalsIgnoreCase("pneg")){
        //上传格式正确,重命名文件
        String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
        System.out.println("2.5 new fileName===>"+uploadFile.getName());
        //新建这么一个文件,File API
        File targetFile = new File(path,fileName); 
        if(!targetFile.exists()){
          targetFile.mkdirs();
        }
        //保存
        try{
          //上传
          uploadFile.transferTo(targetFile);
        }catch (Exception e){
          e.printStackTrace();
          request.setAttribute("uploadFileError", "* 上传失败! ");
          System.out.println("* 上传失败! ");
          return "useradd";
        }
        idPicPath = path+File.separator+fileName;
      }else{
        request.setAttribute("uploadFileError", "* 上传格式错误!");
        System.out.println("* 上传格式错误!");
        return "useradd";
      }
    }
    System.out.println("user.idPicPath: "+ user.getIdPicPath());
    user.setIdPicPath(idPicPath);
    System.out.println("user is: "+user.toString());
    return "userlist";
      
  }      

在springmvc配置文件注册MultipartResolver:

<!-- 配置MultipartResolver -->
    <bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="maxUploadSize" value="5000000"></property>
      <property name="defaultEncoding" value="UTF-8"></property> 
     </bean>      

测试结果:

测试输入:

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

图2

打印日志:

test==
begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>a.jpg
2.3 uploadFile prefix ===>jpg
2.4 uploadFile filesize ===>2345446
2.5 new fileName===>uploadFile
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=1885454522, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517581833771_Personal.jpg, workPicPath=null, roleName=null]      

文件上传:

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

图3 上传的文件

【2】多文件与数据模型同时传递

View层:

<h5>以下为上传多文件+其他数据测试</h5>
     <form action="${pageContext.request.contextPath }/user/uploadb" method="post" enctype="multipart/form-data">
             用户编码 :<input type="text" name="userCode" value=""/><br>
             用户名称 :<input type="text" name="userName" value=""/><br>
      用户密码 :<input type="text" name="userPassword" value=""/><br>
      用户地址 :<input type="text" name="address" value=""/>   <br>
      用户电话 : <input type="text" name="phone" value=""/><br>
      用户生日 :<input type="text" name="birthday" value=""/><br>
      用户性别: <select name="gender" id="gender">
                 <option value="1">女</option>
                 <option value="2" selected="selected">男</option>
            </select><br>
      用户角色 :<select name="userRole" id="userRole">
              <option value="100" selected="selected">tour</option>
              <option value="101">OrdinaryUser</option>
              <option value="110">Administrator</option>
              <option value="111">Manager</option>
            </select><br>
         <div>
            <input type="hidden" id="errorinfo" value="${uploadFileError}">         
                      文件1:<input type="file" name="uploadFiles"/><br/><br/>
         </div>
         <div>
            <input type="hidden" id="errorinfo" value="${uploadFileError}">
                      文件2:<input type="file" name="uploadFiles"/><br/><br/>         
         </div>
         <input type="submit" value="上传"/>
   </form>      

Controller层:

@RequestMapping(value="/uploadb",method=RequestMethod.POST)
  public String test2(User user,HttpSession session,
      HttpServletRequest request,
      @RequestParam(value="uploadFiles",required=false)MultipartFile[] uploadFiles) throws SQLException{
    String errorInfo = null;
    String idPicPath = null;
    String workPicPath = null;
    boolean flag = true;
    //获取保存文件的绝对路径
    String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
    System.out.println("2.1 uploadFile path ===>"+path);
    
    for(int i=0;i<uploadFiles.length;i++){
      MultipartFile uploadFile = uploadFiles[i];
      System.out.println("开始-flag: "+flag);
      if(!uploadFile.isEmpty()){
        if(i==0){
          errorInfo = "uploadFileError!";
        }else if(i==1){
          errorInfo = "uploadWpError!";
        }
        System.out.println("文件数量-flag: "+flag);
        String oldFileName = uploadFile.getOriginalFilename();
        String prefix = FilenameUtils.getExtension(oldFileName);
        int filesize = 500000;
        if(uploadFile.getSize() > filesize){
          request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
          System.out.println("* 上传大小不得超过5000KB");
          flag = false;
          System.out.println("文件大小-flag: "+flag);
          return "useradd";
        }else if(prefix.equalsIgnoreCase("jpg")
               || prefix.equalsIgnoreCase("png")
               || prefix.equalsIgnoreCase("jpeg")
               || prefix.equalsIgnoreCase("pneg")){
          //上传格式正确,重命名文件
          String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
          System.out.println("2.2 new fileName===>"+uploadFile.getName());
          //新建这么一个文件,FILE API
          File targetFile = new File(path,fileName); 
          if(!targetFile.exists()){
            targetFile.mkdirs();
          }
          System.out.println("格式-flag: "+flag);
          //保存
          try{
            //上传
            uploadFile.transferTo(targetFile);
          }catch (Exception e){
            e.printStackTrace();
            request.setAttribute("uploadFileError", "* 上传失败! ");
            System.out.println("* 上传失败! ");
            flag = false;
            System.out.println("上传-flag: "+flag);
            return "useradd";
          }
          if(i==0){
            idPicPath = path+File.separator+fileName;
            log.info("2.3 idPicPath==>"+idPicPath);
          }else if(i==1){
            workPicPath = path+File.separator+fileName;
            log.info("2.4 workPicPath==>"+workPicPath);
          }
          
        }else{
          request.setAttribute("uploadFileError", "* 上传格式错误!");
          System.out.println("* 上传格式错误!");
          flag = false;
          return "useradd";
        }
      }
    }
    System.out.println("flag:"+flag);
    if(flag){
      System.out.println("user.idPicPath: "+ user.getIdPicPath());
      user.setIdPicPath(idPicPath);
      System.out.println("user is: "+user.toString());
    }
    return "useradd";
  }      

测试结果:

测试输入:

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

图4

打印日志:

test==
begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>a.jpg
2.3 uploadFile prefix ===>jpg
2.4 uploadFile filesize ===>2345446
2.5 new fileName===>uploadFile
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=1885454522, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517581833771_Personal.jpg, workPicPath=null, roleName=null]
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
开始-flag: true
文件数量-flag: true
2.2 new fileName===>uploadFiles
格式-flag: true
18/02/02 22:39:10 INFO Controller.UserController: 2.3 idPicPath==>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517583031535_Personal.jpg
开始-flag: true
文件数量-flag: true
2.2 new fileName===>uploadFiles
格式-flag: true
18/02/02 22:39:10 INFO Controller.UserController: 2.4 workPicPath==>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517582509250_Personal.jpg
flag:true
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=123456, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517583031535_Personal.jpg, workPicPath=null, roleName=null]      

文件上传:

SpringMVC(25):使用springmvc 同时上传文件与数据(数据模型或基础类型数据)的示例

继续阅读