错误信息:
nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided] with root cause
java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
错误原因:
spring mvc文件上传可以有两种方式,一种是common-upload,一种是servlet-api 3.0的文件上传,我选择的是servlet 3.0的文件上传。
因此在mvc-dispatcher-servlet.xml中需要配置支持servlet 3.0文件处理的resovler
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
本以为spring mvc会处理好servlet 3.0文件上传的配置,就只配置了resolver,结果就出现了现在的这个exception。
解决办法:
servlet 3.0 api中规定了两种方式配置上传文件的servlet:
1. 在servlet类的java代码中添加@MultipartConfig
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
2.如果没有在上传文件的servlet中添加,则需要在web.xml里配置的servlet里,而spring mvc中就是DispatcherServlet里添加multipart-config片段。
<multipart-config>
<location>/tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
multipart-config所有的属性都是可选的,具体属性如下:
- fileSizeThreshold: int 当数据量大于该值时,内容将被写入文件,默认值为0bytes
- location: String 存放生成的文件地址,默认值为“”,文件地址是文件系统里的据对路径,它不支持相对路径,所以一般不要配置它
- maxFileSize: long 允许上传的文件最大值。默认值为 -1,表示没有限制。
- maxRequestSize: long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。
1.location属性,既是保存路径(在写入的时候,可以忽略路径设定),又是上传过程中临时文件的保存路径,一旦执行write方法之后,临时文件将被自动清除。
2.上传过程中无论是单个文件超过maxFileSize值,或者上传总的数据量大于maxRequestSize值都会抛出IllegalStateException异常
3.这里所有有关size的属性,单位都是byte