SpringMVC处理multipart请求的示例代码
一、简述 multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。类似这样: 二、 配置 multipart 解析器 尽管multipart请求看起来很复杂,但在Spring MVC中处理它们却很容易。在编写控制器方法处理文件上传之前,我们必须要配置一个multipart解析器,通过它来告诉DispatcherServlet该如何读取multipart请求。 Spring 内置了两个MultipartResolver的实现:
StandardServletMultipartResolver的配置: 1、声明Bean: 在applicationContext.xml 配置 复制代码 代码如下: <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver> 在配置类中配置 @Bean(name = "multipartResolver") public StandardServletMultipartResolver getStandardServletMultipartResolver(){ return new StandardServletMultipartResolver(); } tips:multipart解析器的命名一定要是 multipartResolver ,否则会报错。 2、配置上传参数: * web.xml 配置 <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <multipart-config> <!--上传到/tmp/upload 目录--> <location>/tmp/upload</location> <!--文件大小为2M--> <max-file-size>2097152</max-file-size> <!--整个请求不超过4M--> <max-request-size>4194304</max-request-size> <!--所有文件都要写入磁盘--> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> * 配置类中配置 继承 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 和 配置上传参数 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置上传目录/tmp/upload;最大的文件容量设置为2M;最大的内存大小设置为0,表示所有文件都会写入磁盘中;无法设定multipart请求整体的最大容量--> <property name="uploadTempDir" value="/tmp/upload"/> <property name="maxUploadSize" value="2097152"/> <property name="maxInMemorySize" value="0"/> </bean> 区别: 1、 CommonsMultipartResolver 相比较 StandardServletMultipartResolver 来说 就是无法设定multipart请求整体的最大容量。 2、 CommonsMultipartResolver 不会强制要求设置临时文件路径。默认情况下,这个路径就是 Servlet 容器的临时目录。 StandardServletMultipartResolver 必须设置临时文件路径才能正常执行。(以上所述上传目录均为临时文件路径) 三、SpringMVC 处理请求 1、前端Form 表单 <form action="/picture" method="post" enctype="multipart/form-data"> <input type="file" name="picture"> <input type="submit"> </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"; } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Files.walkFileTree的并行版本(java或scala)
- Java里的值传递与“引用传递”——一些想法
- java – 我收到从int到boolean类型不匹配的错误
- java – JPA Like Integer的运算符
- 详解SpringMVC拦截器(资源和权限管理)
- java-8 – 为什么带副作用的过滤器比基于Spliter
- java – 为什么swagger注释会生成带有默认路径前
- java byte数组与int,long,short,byte的转换实现方
- java – 在JTabbedPane中设置选项卡的大小
- Errors running builder 'JavaScript Valida