• 中文
    • English
  • 注册
  • 查看作者
  • 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
  • 1.5k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: