kbi*_*och 10 spring tomcat file-upload spring-mvc illegalstateexception
所以我是Spring的新手,我正在努力让文件上传为我的项目工作(我正在使用Spring Tool Suite btw.)并且当我提交表单时,我得到的是:
HTTP状态500 - 无法解析多部分servlet请求; 嵌套异常是java.lang.IllegalStateException:由于未提供多部件配置,因此无法处理部件
浏览器的堆栈跟踪:
type Exception report
message Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
description The server encountered an internal error that prevented it from fulfilling this request.
exception
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
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:100)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78)
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
root cause
java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
org.apache.catalina.connector.Request.parseParts(Request.java:2676)
org.apache.catalina.connector.Request.getParts(Request.java:2643)
org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1083)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:85)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:78)
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:75)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:108)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs.
这是jsp中的表单标记:
<form:form class="form-horizontal" role="form" method="post"
action="newArtist.html" modelAttribute="artist" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)
输入部分:
<div class="form-group">
<div class="col-lg-3">
<label for="photo">Artist photo:</label>
<form:input type="file" id="photo" path="photo"></form:input>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
照片存储在Artist对象的此字段中:
@Lob
private byte[] photo;
Run Code Online (Sandbox Code Playgroud)
控制器映射方法:
@RequestMapping(value = "/newArtist", method = RequestMethod.GET)
public String showAddArtistForm(Model model)
{
model.addAttribute("artist", new Artist());
return "newArtist";
}
@RequestMapping(value = "/newArtist", method = RequestMethod.POST)
public String addArtist(@ModelAttribute("artist") @Valid Artist artist, BindingResult result,
@RequestParam("photo") MultipartFile photo) throws IOException
{
if (result.hasErrors())
return "newArtist";
if(photo.getBytes() != null)
artist.setPhoto(photo.getBytes());
artistService.addArtist(artist);
return "redirect:artists.html";
}
Run Code Online (Sandbox Code Playgroud)
servlet-context.xml中的多部分解析器配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
web.xml中的过滤器:
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
依赖关系:
<!-- Apache Commons FileUpload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我还将Tomcat的配置文件context.xml导入到META-INF/context.xml并编辑了Context标签,如下所示:
<Context allowCasualMultipartParsing="true">
Run Code Online (Sandbox Code Playgroud)
似乎没有任何工作,任何帮助将不胜感激.
没有一个答案正确地解决了这个问题。根据Tomcat 文档,关于配置allowCasualMultipartParsing:
如果在调用 HttpServletRequest.getPart* 或 HttpServletRequest.getParameter* 时 Tomcat 应自动解析 multipart/form-data 请求主体,则设置为 true,即使目标 servlet 未使用 @MultipartConfig 注释标记(请参阅 Servlet 规范 3.0,第 3.2 节)详情)。请注意,除 false 之外的任何设置都会导致 Tomcat 以不符合技术规范的方式运行。默认值为假。
那么,合规的方式是什么?阅读官方JEE 6 教程给出了一个提示。如果您想对 Servlet 3 或更新版本使用符合规范的方式,您的 servlet 必须有一个MultipartConfig. 根据您配置 servlet 的方式,您有三种选择:
context.addServlet(name, servlet).setMultipartConfig(new MultipartConfigElement("your_path").@javax.servlet.annotation.MultipartConfig.使用 XML 配置,将其添加到WEB-INF/web.xml描述符的 servlet 部分:
<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>
Run Code Online (Sandbox Code Playgroud)实际上,使用Spring MVC上载多部分文件时,不需要在web.xml上使用任何过滤器。我在项目中使用了相同的配置,并且可以正常工作($ {spring.version} = 4.3.4.RELEASE):
聚甲醛
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Apache Commons FileUpload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
的HTML
<form method="POST" enctype="multipart/form-data" action="uploadAction">
<table>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td></td><td><input type="submit" value="Upload" /></td></tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)
春天的背景
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
弹簧控制器
@PostMapping("/uploadAction")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
File out = new File("outputfile.pdf");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(out);
// Writes bytes from the specified byte array to this file output stream
fos.write(file.getBytes());
System.out.println("Upload and writing output file ok");
} catch (FileNotFoundException e) {
System.out.println("File not found" + e);
} catch (IOException ioe) {
System.out.println("Exception while writing file " + ioe);
} finally {
// close the streams using close method
try {
if (fos != null) {
fos.close();
}
} catch (IOException ioe) {
System.out.println("Error while closing stream: " + ioe);
}
//storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/";
}
}
Run Code Online (Sandbox Code Playgroud)
我有类似的东西,但我所做的只是发送一个文件,而不将其与我的模型中的任何属性映射,在您的情况下,我会修改它:
<div class="form-group">
<div class="col-lg-3">
<label for="photo">Artist photo:</label>
<input type="file" id="photo" name="file"/>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
在你的控制器中
@RequestMapping(value = "/newArtist", method = RequestMethod.POST)
public String addArtist(@ModelAttribute("artist") @Valid Artist artist, BindingResult result,
@RequestParam("file") MultipartFile file) throws IOException
//Here read the file and store the bytes into your photo attribute
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25460 次 |
| 最近记录: |