Spring MVC文件上传

Spring MVC文件上传

Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。

1. MultipartResolver接口

在 Spring MVC 中实现文件上传十分容易,它为文件上传提供了直接支持,即 MultpartiResolver 接口
MultipartResolver 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作

MultpartiResolver 接口有以下两个实现类:

  • StandardServletMultipartResolver: 使用了 Servlet 3.0 标准的上传方式

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

MultpartiResolver 接口具有以下方法

名称 作用
byte[] getBytes() 以字节数组的形式返回文件的内容
String getContentType() 返回文件的内容类型
InputStream getInputStream() 返回一个InputStream,从中读取文件的内容
String getName() 返回请求参数的名称
String getOriginalFillename() 返回客户端提交的原始文件名称
long getSize() 返回文件的大小,单位为字节
boolean isEmpty() 判断被上传文件是否为空
void transferTo(File destination) 将上传文件保存到目标目录下

使用 CommonsMultipartResolver 来完成文件上传,
分为单文件上传多文件上传两部分介绍

2. 文件上传

2.1 maven引入


<dependency>
    <groupId>commons-iogroupId>
    <artifactId>commons-ioartifactId>
    <version>2.11.0version>
dependency>

<dependency>
    <groupId>commons-fileuploadgroupId>
    <artifactId>commons-fileuploadartifactId>
    <version>1.4version>
dependency>

2.2 配置 MultipartResolver

使用 CommonsMultipartReslover 配置 MultipartResolver 解析器,在 springmvc.xml 中添加代码如下:multipartResolver


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

二选一

    @Bean("multipartResolver") //名称为固定multipartResolver
    public CommonsMultipartResolver  multipartResolver2(){
        CommonsMultipartResolver resolver  = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setMaxUploadSize(500000);
        return resolver;
    }
  • defaultEncoding: 请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8
    (注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容)
  • maxUploadSize: 上传文件大小上限,单位为字节

2.3 编写文件上传表单页面

负责文件上传表单的编码类型必须是“multipart/form-data”类型。

2.4 上传页面

   <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Titletitle>
head>
<body>
   <form action="/upload" method="post" enctype="multipart/form-data">
       <input type="file" name="file01"><br/>
       <input type="submit" value="上传">
   form>
body>
html>

2.5 编写控制器

测试:

@Controller
public class UploadController {
    @GetMapping("/upload")
    public String  get(){
        return "upload";
    }
    @PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
        //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
  
        return "ok";
    }
}

debug测试: 测试运行试一下:

存储文件:controller中编写

@PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
        //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
        //获取文件名字
        String name=file01.getOriginalFilename();
        //transferTo方法将上传文件写到服务器上指定的文件;
        file01.transferTo(new File(path,name));
        return "ok";
    }

也可以把路径写死:

 file01.transferTo(new File("D:\\206",name));

Spring MVC文件上传_第1张图片

加入图片uuid随机生成名字:

 String name= IdUtil.fastSimpleUUID()+"-"+file01.getOriginalFilename();

加入判断防止用户恶意测试:

if(file01.isEmpty()){
            return "请选择文件";
        }

代码修改:

@PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
      if(file.isEmpty()){
            return  "请选择文件";
        }
         //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
        //获取文件名字
        String name = IdUtil.fastSimpleUUID()+"_"+ file.getOriginalFilename();
        //transferTo方法将上传文件写到服务器上指定的文件;
        file01.transferTo(new File(path,name));
        return "ok";
    }

配置类中配置:

@Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver=new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setMaxUploadSize(5000000);
        return resolver;
    }

你可能感兴趣的:(springmvc,spring,mvc,java)