文件上传

文件上传

  1.MultipartResolver接口

    1)用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作

    2)两个实现类

      StandardServletMultipartResolver

      使用了Servlet3.0标准的上传方式

      CommonsMultipartResolver

      使用了Apache的commons-fileupload来完成具体的上传操作

  2. 使用 CommonsMultipartResolver实现单文件上传

    第一步:导入jar

      commons-io-2.4.jar

      commons-fileupload-1.2.2.jar

    第二步:配置文件(springmvc.xml)

      <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

          <property name="maxUploadSize" value="5000000"/>

          <property name="defaultEncoding" value="UTF-8"/>

      </bean>

    第三步:表单页面

      method="POST"

      enctype="multipart/form-data"

      指定表单内容类型,支持文件上传

      <input type="file" name="a_idPicPath"/>

      用来上传文件的file组件

    第四步:实现controller(多文件上传)

      例:public String add(@Valid User user,BindingResult bindingResult,HttpServletRequest request,

               @RequestParam(value="a_idPicPath",required = false) MultipartFile[] attachs){

        for(int i=0;i<attachs.length;i++){

          //操作图片

          if(!attachs[i].isEmpty()){

            //1.找到目录

            String path = request.getSession()

                  .getServletContext()

                  .getRealPath("statics"+File.separator+"uploadfiles");

            //2.创建文件

            //2.1 原来文件名

            String oldName = attachs[i].getOriginalFilename();

            String suffix = FilenameUtils.getExtension(oldName);

            //2.2 取名字

            String fileName = System.currentTimeMillis()+"_user."+suffix;

            File targetFile = new File(path,fileName);

            //把图片放到指定的目录

            try {

              attachs[i].transferTo(targetFile);

            } catch (Exception e) {

              e.printStackTrace();

              request.setAttribute("uploadError", "上传失败");

              return "useradd";

            }

            //设置数据库值

            if(i==0){

              user.setIdPicPath(path+File.separator+fileName);

            }

            if(i==1){

              user.setWorkPicPath(path+File.separator+fileName);

            }

          }

        }

        user.setCreationDate(new Date());

        user.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());

        if(userService.add(user)){

          return "redirect:query";

        }else{

          return "useradd";

        }

      }

      注意:a)MultipartFile

          Spring MVC会将上传文件绑定到MultipartFile对象中,并通过该对象完成文件的上传操作提供的方法

        b)File.separator

          Windows、Linux自适应路径分隔符

          低入侵性的代码实现

        c)必须对上传文件进行重命名

      原因

        原文件名存在中文                          乱码问题

        原文件名与服务器上已有文件重名    覆盖问题

        重新定义上传文件名(保证不重名)

        当前系统时间+随机数+“_Personal.jpg”

         d)文件上传成功后,须更新数据库字段(idPicPath),记录上传文件的存储路径

  3. 多文件上传(基本同上)

    1)上传文件的组件名一致,以数组的形式传递给控制器的处理方法

      <label for="a_idPicPath">证件照:</label>

      <input type="file" name="attachs" id="a_idPicPath"/>

      <label for="a_workPicPath">工作证照片:</label>

      <input type="file" name="attachs" id="a_workPicPath"/>

     2) 控制器-处理方法addUserSave()

      修改入参MultipartFile为数组

      MultipartFile[] attachs

      MultipartFile[] 数组内存放文件对象顺序

       按照form表单的file标签的顺序进行存储

      分别更新字段:idPicPath、workPicPath

       注意:若入参对象MultipartFile为数组时,

        该参数前面必须要加上@RequestParam注解,否则会报错

原文地址:https://www.cnblogs.com/yang82/p/8421564.html