• 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • SpringMVC:文件上传

      一.  文件上传

      先说一下我们接下来要实现的功能:在jsp页面新建一个用于文件上传的表单,通过表单选择本地电脑上的任意文件,点击上传后保存在项目的根路径下(out/xxx/xxx/upload)

      1.   添加相关依赖

      《SpringMVC:简单使用》一文中用到的依赖基础上,添加下面的两个依赖:

      • commons-fileupload-1.2.1.jar

      • commons-io-1.4.jar

      2.  新建任意jsp(为方便起见,这里以index.jsp为例),添加用于上传的表单

      <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
      <!DOCTYPE html>
      <html>
      <head>
        <title>Title</title>
      </head>
      <body>
      <form action="${pageContext.request.contextPath}/result"
            method="post"
            enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传">
      </form>
      </body>
      </html>

      其中 enctype=”multipart/form-data意为不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。[1] 

      method也必须是post才可以完成文件上传

      input的type需要为file

      3.  在spring-mvc.xml中配置CommonsMultipartResolver

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

      4.  在Controller完成文件的保存

      package io.zhangjia.springmvc.controller;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.multipart.MultipartFile;
      import java.io.IOException;
      import java.io.InputStream;
      @Controller
      public class Upload {
          @RequestMapping("/result")
          public String upload(MultipartFile file) throws IOException {
              System.out.println("file = [" + file + "]");
              System.out.println(file.getName()); //参数名
              System.out.println(file.getOriginalFilename());//文件名
              System.out.println(file.getContentType());//文件类型
              System.out.println(file.getSize());//文件大小
              InputStream is = file.getInputStream();
              return "result";
          }
      }
      输出:
      file = [org.springframework.web.multipart.commons.CommonsMultipartFile@480b15e5]
      file
      1.png
      image/png
      15030

      二.  文件复制

      一般文件复制或者保存的时候,为避免重名问题,不会再使用原文件名,可以通过UUID来生成一个唯一的标识。关于UIUD的简介,可以查看知乎:UUID是如何保证唯一性的?

      package io.zhangjia.springmvc.controller;
      import org.apache.commons.io.IOUtils;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.multipart.MultipartFile;
      import sun.nio.ch.IOUtil;
      import javax.servlet.http.HttpServletRequest;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.UUID;
      @Controller
      public class Upload {
          @RequestMapping("/result")
          public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
              String filename = file.getOriginalFilename();//获取文件名
              InputStream is = file.getInputStream();
              UUID uuid = UUID.randomUUID();
              String realPath = request.getServletContext().getRealPath("/upload");
              // realPath = E:\Java\IDEA_Project\JavaWeb\sping-mvc-1\out\artifacts\sping_mvc_1_war_exploded\upload
              File saveFile = new File(realPath+File.separator + uuid + filename.substring(filename.lastIndexOf(".")));
              File parentFile = saveFile.getParentFile();
              if(!parentFile.exists()){
                  parentFile.mkdirs();
              }
              FileOutputStream os = new FileOutputStream(saveFile);
              IOUtils.copy(is,os);
              os.close();
              is.close();
              return "result";
          }
      }

      三.  总结

      1.  文件上传

      • form中添加enctype=”multipart/form-data”属性

      • spring-mvc.xml添加bean,class为CommonsMultipartResolver(快捷输入:CMR),id必须为multipartResolver

      • 使用MultipartFile 作为形参来获取上传的文件

      2.  文件复制

      • 获取文件名

      • 获取InputStream

      • 获取UUID

      • 获取保存的路径

      • 判断并创建要保存的路径

      • 获取FileOutputStream

      • 复制文件 

      参考资料

      [1] :w3school

    • 0
    • 0
    • 0
    • 408
    • 请登录之后再进行评论

      登录
    • 单栏布局 侧栏位置: