SpringMVC处理multipart请求的示例代码

网友投稿 328 2023-03-01


SpringMVC处理multipart请求的示例代码

一、简述

multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。类似这样:

二、 配置 multipart 解析器

尽管multipart请求看起来很复杂,但在Spring MVC中处理它们却很容易。在编写控制器方法处理文件上传之前,我们必须要配置一个multipart解析器,通过它来告诉DispatcherServlet该如何读取multipart请求。

Spring 内置了两个MultipartResolver的实现:

CommonsMultipartResolver :使用Jakarta CommnLfUDons FileUpload解析multipart请求;

StandardServletMultipartResolver :依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1)。

StandardServletMultipartResolhttp://ver的配置:

1、声明Bean:

在applicationContext.xml 配置

复制代码 代码如下:

public StandardServletMultipartResolver getStandardServletMultipartResolver(){

return new StandardServletMultipartResolver();

}

tips:multipart解析器的命名一定要是 multipartResolver ,否则会报错。

2、配置上传参数:

* web.xml 配置

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:applicationContext.xml

1

/tmp/upload

2097152

4194304

0

dispatcherServlet

/

* 配置类中配置

继承 AbstractAnnotationConfigDispatcherServletInitializer 的配置类

@Override

protected void customizeRegistration(ServletRegistration.Dynamic registration) {

//上传到/tmp/upload 目录,文件大小为2M,整个请求不超过4M,而且所有文件都要写入磁盘

registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0));

}

CommonsMultipartResolver的配置:

1、声明Bean 和 配置上传参数

public StandardServletMultipartResolver getStandardServletMultipartResolver(){

return new StandardServletMultipartResolver();

}

tips:multipart解析器的命名一定要是 multipartResolver ,否则会报错。

2、配置上传参数:

* web.xml 配置

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:applicationContext.xml

1

/tmp/upload

2097152

4194304

0

dispatcherServlet

/

* 配置类中配置

继承 AbstractAnnotationConfigDispatcherServletInitializer 的配置类

@Override

protected void customizeRegistration(ServletRegistration.Dynamic registration) {

//上传到/tmp/upload 目录,文件大小为2M,整个请求不超过4M,而且所有文件都要写入磁盘

registration.setMultipartConfig(new MultipartConfigElement("E:\\upload_ftp",2097152,4194304,0));

}

CommonsMultipartResolver的配置:

1、声明Bean 和 配置上传参数

区别:

1、 CommonsMultipartResolver 相比较 StandardServletMultipartResolver 来说 就是无法设定multipart请求整体的最大容量。

2、 CommonsMultipartResolver 不会强制要求设置临时文件路径。默认情况下,这个路径就是 Servlet 容器的临时目录。 StandardServletMultipartResolver 必须设置临时文件路径才能正常执行。(以上所述上传目录均为临时文件路径)

三、SpringMVC 处理请求

1、前端Form 表单

tips:需要设置   enctype="multipart/form-data",以告诉SpringMVC 这是一个Multipart 请求。

2、后端MVC接受请求

@RequestMapping(value = "/picture",method = RequestMethod.POST)

public String getHome(@RequestPart("picture") MultipartFile picture) throws IOException {

String name = picture.getName();

byte[] bytes = picture.getBytes();

picture.transferTo(new File("/"+picture.getOriginalFilename()));

//这里保存到文件系统的时候要用相对路径,比如这里配置的是 /。以配置的上传目录为基准。即文件路径 E:/upload_ftp/ 是保存的目录

return "home";

}

tips:1、@RequestPart("picture") : 当注册表单提交的时候,p icture 属性将会给定一个 byte 数组,这个数组中包含了请求中对应 part 的数据(通过 @RequestPart 指定)。如果用户提交表单的时候没有选择文件,那么这个数组会是空(而不是 null )。所以说我们甚至可以用byte[]数组接收Multipart请求而不用  MultipartFile。

2、MultipartFile :用MultipartFile方法接收为我们提供了很多的方法以便进行接下来的工作...

3、 以 Part的形式接受上传的文件

就主体来言, Part 接口与 MultipartFile 并没有太大的差别。  在很多情况下, Part 方法的名称与 MultipartFile 方法的名称是完全相同的。有一些比较类似,但是稍有差异,比如 getSubmittedFileName() 对应于 getOriginalFilename() 。类似地, write() 对应于 transferTo() ,借助该方法我们能够将上传的文件写入文件系统中。

值得一提的是,如果在编写控制器方法的时候,通过Part参数的形式接受文件上传,那么就没有必要设置MultipartResolver 了。只有使用MultipartFile的时候,我们才需要MultipartResolver。

@RequestMapping(value = "/picture",method = RequestMethod.POST)

public String getHome(@RequestPart("picture") Part picture) throws IOException {

picture.write("/"+picture.getSubmittedFileName());

return "home";

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring BeanPostProcessor接口使用详解
下一篇:api文档怎么接口(api接口是怎么写出来的)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~