我有一个带弹簧的Web应用程序,我在其中进行一些文件上传。在eclipse下,使用Jetty(maven插件),它完美无缺。但是当我在Tomcat下部署应用程序时,它没有,我得到以下异常:
org.springframework.web.bind.MissingServletRequestParameterException: Required org.springframework.web.multipart.MultipartFile parameter 'file' is not present
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:545)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:336)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:207)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:132)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
这是我的表格:
<form method="post" action="../admin/import.html" id="import"
enctype="multipart/form-data">
<div id="importInmates" align="center">
<input type="file" name="file" id="file"
data-dojo-type="dijit.form.Button"
label="<fmt:message key='import.file' />" />
<button data-dojo-type="dijit.form.Button" id="importInmates"
type="submit">
<fmt:message key="import.import" />
</button>
</div>
<input type="hidden" name="importType" value="inmates" />
</form>
以下是截取方法:
@RequestMapping(value = IMPORT_PAGE, method = RequestMethod.POST)
public String recieveFile(@RequestParam("importType") String importType,
@RequestParam("file") MultipartFile multipartFile, final HttpSession session)
{
if (multipartFile.getSize() < 0)
{
LOGGER.debug("No file has been uploaded");
return "redirect:.." + IMPORT_PAGE;
}
File file = new File("tmp");
try
{
multipartFile.transferTo(file);
BufferedReader lec = new BufferedReader(new FileReader(file));
LOGGER.debug(lec.readLine());
lec.close();
}
catch (Exception e)
{
LOGGER.error("An exception occured while reading " + importType + " file", e);
}
return "redirect:.." + IMPORT_PAGE;
}
我添加了以下bean:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000"></property>
</bean>
在applicationContext.xml和mvc-servlet.xml中,即使我认为只有后者很重要。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:2)
感谢@Bart,我找到了以下简单的解决方案:
在拦截方法中,使用@ModelAttribute而不是@RequestParam:
@RequestMapping(value = IMPORT_PAGE, method = RequestMethod.POST)
public String recieveFile(@RequestParam("importType") String importType,
@ModelAttribute("file") UploadedFile uploadedFile, final HttpSession session)
{
MultipartFile multipartFile = uploadedFile.getFile();
UploadedFile是以下类:
public class UploadedFile
{
private String type;
private MultipartFile file;
public String getType()
{
return type;
}
public void setType(String type)
{
this.type = type;
}
public void setFile(MultipartFile file)
{
this.file = file;
}
public MultipartFile getFile()
{
return file;
}
}
它正在工作!!
感谢大家的帮助。
答案 1 :(得分:1)
使用@RequestPart
代替@RequestParam
。
来自消息来源:
可用于关联&#34; multipart / form-data&#34;的部分的注释。请求 用方法参数。支持的方法参数类型包括{@link MultipartFile} 结合Spring的{@link MultipartResolver}抽象, {@code javax.servlet.http.Part}结合Servlet 3.0多部分请求, 或者对于任何其他方法论证,零件的内容通过一个 {@link HttpMessageConverter}考虑到&#39;内容类型&#39;头 请求部分。这类似于@ {@ link RequestBody}要解决的问题 基于非多部分常规请求的内容的参数。
请注意,@ {link RequestParam}注释也可用于关联 &#34; multipart / form-data&#34;的一部分使用支持相同的方法参数的请求 方法参数类型。主要区别在于当方法参数不是a时 字符串,@ {@ link RequestParam}依赖于通过注册的类型转换 {@link Converter}或{@link PropertyEditor},而{@ link RequestPart}依赖 在{@link HttpMessageConverter}考虑到&#39;内容类型&#39;头 请求部分。 @ {@link RequestParam}可能与名称 - 值形式一起使用 字段虽然@ {@ link RequestPart}可能与包含更多内容的部分一起使用 复杂内容(例如JSON,XML)。