Spring MVC3.2 通过Servlet3.0实现文件上传
Servlet3.0规范增加了对文件上传的原生支持,这里记录一下Spring MVC3通过Servlet3上传文件的实现。
配置文件:
applicationContext.xml
<!-- spring mvc3+servlet3上传文件需要配置 --><beanid="multipartResolver"class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>
web.xml中需要配置multipart-config片段
<!-- spring mvc --><servlet><servlet-name>SpringMvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/spring/appContext.xml,/WEB-INF/config/spring/appInterceptor.xml</param-value></init-param><multipart-config><max-file-size>52428800</max-file-size><max-request-size>52428800</max-request-size><file-size-threshold>0</file-size-threshold></multipart-config><load-on-startup>1</load-on-startup></servlet>
update.jsp上传界面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"><title>twovs.com测试servlet3+springmvc3.2上传文件</title></head><body><h1>Please upload a file</h1><formmethod="post"action="http://www.twovs.com/test/up.htm"enctype="multipart/form-data"><inputtype="text"name="name"value="1111"/><inputtype="file"name="file"/><inputtype="submit"/></form></body></html>
UpdateTest4Servlet.java Spring MVC Controller
/**
* $id: com.twovv.update.UpdateTest4Servlet.java by fjt 2013-2-15
*
* @version:0.1
*
* Copyright (c) 2013 twovv.com
*/package com.twovv.update;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.multipart.MultipartFile;/** @Class: UpdateTest4Servlet @TODO: 测试上传 */@ControllerpublicclassUpdateTest4Servlet{/**
* @method: fileUpload() -by fjt
* @TODO: 文件上传
* @return String
*/@RequestMapping(value="/test/up",method=RequestMethod.POST)publicString fileUpload(@RequestParamString name,@RequestParamMultipartFile file){////你自己的存储逻辑//这里只打印一下接收到的信息System.out.println(name);/**
* file.getName()获取不到文件名,只能拿到一个“file”字符串
* Servlet3没有提供直接获取文件名的方法,可以从请求头中解析出来:
* file.getHeader("content-disposition")方法间接获取得到。
*/System.out.println(file.getName());System.out.println(file.getSize());return"";}}
简单的配置完成,现在可以通过访问http://www.twovs.com/upload.jsp来测试通过servlet3.0的新特性来上传文件了。
碰到的问题:
Spring @RequestParam绑定不到值(获取不到值)。
异常日志:
2013-02-1504:05:02,862[DEBUG]-[org.springframework.web.servlet.DispatcherServlet]DispatcherServletwith name 'SpringMvc' processing POST request for[/ueditor/test/up.htm]2013-02-1504:05:02,869[DEBUG]-[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]Looking up handler method for path /test/up.htm
2013-02-1504:05:02,879[DEBUG]-[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]Returning handler method [public java.lang.String com.twovv.update.UpdateTest4Servlet.fileUpload(java.lang.String,org.springframework.web.multipart.MultipartFile)]2013-02-1504:05:02,879[DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory]Returning cached instance of singleton bean 'updateTest4Servlet'2013-02-1504:05:02,895[DEBUG]-[org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor]Opening JPA EntityManagerinOpenEntityManagerInViewInterceptor2013-02-1504:05:03,055[DEBUG]-[org.hibernate.internal.SessionImpl]Opened session at timestamp:136087230292013-02-1504:05:03,112[DEBUG]-[org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver]Resolving exception from handler [public java.lang.String com.twovv.update.UpdateTest4Servlet.fileUpload(java.lang.String,org.springframework.web.multipart.MultipartFile)]: org.springframework.web.bind.MissingServletRequestParameterException:RequiredString parameter 'name'isnot present
2013-02-1504:05:03,118[DEBUG]-[org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver]Resolving exception from handler [public java.lang.String com.twovv.update.UpdateTest4Servlet.fileUpload(java.lang.String,org.springframework.web.multipart.MultipartFile)]: org.springframework.web.bind.MissingServletRequestParameterException:RequiredString parameter 'name'isnot present
2013-02-1504:05:03,118[DEBUG]-[org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver]Resolving exception from handler [public java.lang.String com.twovv.update.UpdateTest4Servlet.fileUpload(java.lang.String,org.springframework.web.multipart.MultipartFile)]: org.springframework.web.bind.MissingServletRequestParameterException:RequiredString parameter 'name'isnot present
2013-02-1504:05:03,119[DEBUG]-[org.springframework.web.servlet.DispatcherServlet]NullModelAndView returned to DispatcherServletwith name 'SpringMvc': assuming HandlerAdapter completed request handling
2013-02-1504:05:03,119[DEBUG]-[org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor]Closing JPA EntityManagerinOpenEntityManagerInViewInterceptor2013-02-1504:05:03,148[DEBUG]-[org.springframework.orm.jpa.EntityManagerFactoryUtils]Closing JPA EntityManager2013-02-1504:05:03,155[DEBUG]-[org.springframework.web.servlet.DispatcherServlet]Successfully completed request
异常原因:根据Spring3的提示,缺少multipart-config配置
In order to useServlet3.0 based multipart parsing, you need to mark the DispatcherServletwith a "multipart-config" section in web.xml,orwith a javax.servlet.MultipartConfigElementin programmatic Servlet registration,orincase of a custom Servletclass possibly with a javax.servlet.annotation.MultipartConfig annotation on your Servletclass.Configuration settings such as maximum sizes or storage locations need to be applied at that Servlet registration level asServlet3.0 does not allow for those settings to be donefrom the MultipartResolver.
解决办法:
按照提示需要在web.xml中配置的DispatcherServlet中添加multipart-config片段。
MultipartConfig所有的属性都是可选的,具体属性如下:
fileSizeThreshold int 当数据量大于该值时,内容将被写入文件。
location String 存放生成的文件地址。
maxFileSize long 允许上传的文件最大值。默认值为 -1,表示没有限制。
maxRequestSize long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。
1、location属性,既是保存路径(在写入的时候,可以忽略路径设定),又是上传过程中临时文件的保存路径,一旦执行write方法之后,临时文件将被自动清除。
2、上传过程中无论是单个文件超过maxFileSize值,或者上传总的数据量大于maxRequestSize值都会抛出IllegalStateException异常
参考:
Servlet 3.0's FileUpload Sample
Using a MultipartResolver with Servlet 3.0
JSR 315: JavaTM Servlet 3.0 Specification
JSR-000315 JavaTM Servlet 3.0
转载自:http://www.sxrczx.com/t/article/a3fadb5bd6734a8891c4dad43510ca5e.htm
Spring MVC3.2 通过Servlet3.0实现文件上传的更多相关文章
- Servlet3.0学习总结——基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileu ...
- Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...
- java-基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet3.0中使用request.getParts()获取上传文件
- Servlet3.0之八:基于Servlet3.0的文件上传@MultipartConfig
在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...
- servlet3.0的文件上传代码配置怎么写
之前学习过xml配置servlet3.0的文件上传,但是变成code方式一直不知道怎么弄,相比较起来apache的文件上传配置和xml倒是没什么太大区别. 直接上代码:无需依赖,只要一个方法就好了cu ...
- Servlet3.0 multipart 文件上传技术
Servlet3.0 javaConfig配置 传统的servlet都是在web.xml中配置,从Servlet 3.0开始提供了ServletContainerInitializer接口,允许使用代 ...
- Servlet3.0的文件上传功能
在Servlet3.0之前,文件上传需要借助于第三方插件,在Servlet3.0之后,Servlet本身开始支持文件上传功能. 获取上传的文件可以通过HTTPServletRequest的getPar ...
- spring mvc 3.0 实现文件上传功能
http://club.jledu.gov.cn/?uid-5282-action-viewspace-itemid-188672 —————————————————————————————————— ...
- phpcms v9.6.0任意文件上传漏洞(CVE-2018-14399)
phpcms v9.6.0任意文件上传漏洞(CVE-2018-14399) 一.漏洞描述 PHPCMS 9.6.0版本中的libs/classes/attachment.class.php文件存在漏洞 ...
随机推荐
- C# 播放器, 收藏
C#写了一个调用libvlc api实现的万能视频播放器 http://www.cnblogs.com/haibindev/archive/2011/12/21/2296173.html 引用库 ht ...
- VS2015 安装包
http://download.microsoft.com/download/D/C/9/DC99C86F-5E93-4F77-AF7A-05AAC9BD8B72/vs2015.1.ent_chs.i ...
- android 点击返回键 以及 加载activity 生命周期 记录。。。,一目了然
简叙 Activity 生命周期及android 返回按钮捕捉 @Override protected void onPostCreate(Bundle savedInstanceState) { ...
- HDU 1969 Pie(二分,注意精度)
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- [原创][C#.Winform 控件]Krypton Suite comments
命名空间:ComponentFactory.Krypton.Toolkit 最新版本:v4.4.0 官网状态:已停用 下载地址1:http://downloads.informer.com/krypt ...
- All sentinels down, cannot determine where is mymaster master is running...
修改配置的哨兵文件 vim /sentinel.conf 将保护模式关闭
- 常见的linux服务器构建
Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件的双 ...
- ubuntu,debian root密码忘记破解
开机启动的时候在grub引导时,按住e进行启动项编辑,修改开头有linux字符及最后又ro字符的行,将ro字符改为rw single init=/bin/bash按F10键进行启动即可进入单用户模式, ...
- VB.NET 指针
在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy.PtrToStringUni .PtrToStructure .OffsetOf.WriteXXX,Rrea ...
- ArrayList原理(一)
需要使用到动态数组的时候用的最多的就是ArrayList了,底层其实是Object数组,以下demo基于JDK1.8: List<Integer> list = new ArrayLis ...