我对 Spring 相当陌生,我想要一个多部分表单并处理 MaxUploadSizeExceededException 异常,以便在 jsp 中显示错误消息。我遇到的主要问题是 MaxUploadSizeLimitExceededExceptionResolver 类中的 ModelAndView 对象,我不知道如何将它用于之前解释的此类目标。
我拥有的文件: 1)模型类UploadItem.java。 2) 查看表单UploadForm.jsp。 3) Controller 上传controller.java。 4) MaxUploadSizeLimitExceededExceptionResolver.java类处理Uploadcontroller异常
1) 模型上传项
public class UploadItem {
private String name;
private CommonsMultipartFile fileData;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CommonsMultipartFile getFileData() {
return fileData;
}
public void setFileData(CommonsMultipartFile fileData) {
this.fileData = fileData;
}
}
2) 查看表单UploadForm.jsp
<html>
<head>
<META http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Upload form</title>
</head>
<body>
<form:form modelAttribute="uploadItem" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Upload Fields</legend>
<p>
<form:label for="name" path="name">Name</form:label><br/>
<form:input path="name"/>
</p>
<p>
<form:label for="fileData" path="fileData">File</form:label><br/>
<form:input path="fileData" type="file"/>
</p>
<p>
<input type="submit" />
</p>
</fieldset>
</form:form>
</body>
</html>
3) Controller 上传 Controller
public class Uploadcontroller {
@RequestMapping(method = RequestMethod.GET)
public String getUploadForm(Model model) {
model.addAttribute(new UploadItem());
return "upload/uploadForm";
}
@RequestMapping(method = RequestMethod.POST)
public String create(HttpServletRequest request, UploadItem uploadItem,
BindingResult result, Exception exception) {
if (result.hasErrors()) {
// logger.info("create upload");
for (ObjectError error : result.getAllErrors()) {
System.err.println("Error: " + error.getCode() + " - "
+ error.getDefaultMessage());
}
return "upload/uploadForm";
}
System.err.println("Test upload: " + uploadItem.getName());
System.err.println("Test upload: "
+ uploadItem.getFileData().getOriginalFilename());
// TODO redirect this
return "/home";
}
}
4) 处理异常Uploadcontroller的组件
@Component
public class MaxUploadSizeLimitExceededExceptionResolver extends
SimpleMappingExceptionResolver {
private static final Logger logger = LoggerFactory
.getLogger(HomeController.class);
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception) {
Map<String, Object> model = new HashMap<String, Object>();
logger.info("getUploadForm at the beggining");
ModelAndView modelView = new ModelAndView();
if (exception instanceof MaxUploadSizeExceededException)
{
model.put("errors", exception.getMessage());
modelView.addObject("errors", exception.getMessage());
logger.info("getUploadForm: MaxUploadSizeExceededException" );
} else
{
model.put("errors", "Unexpected error: " + exception.getMessage());
modelView.addObject("errors", "Unexpected error: " +exception.getMessage());
}
logger.info("getUploadForm at the end" );
model.put("uploadedFile", new UploadItem());
modelView.addObject(new UploadItem());//("uploadedFile", new UploadItem());
modelView.setViewName("/upload/uploadForm");
return modelView;
}
}
编辑以添加更多详细信息: 实际上,问题在另一个方向。我的 maxUploadSize 文件的大小设置为 1MB,但我试图对大于 3MB 的文件进行测试。当我尝试使用一个文件时,最大 2 MB 工作正常。问题是我得到一个 ERR_CONNECTION_RESET,它似乎与 Tomcat 有关,maxSwallowSize 的配置 --> stackoverflow.com/questions/29113262/…我将继续研究并保持此线程更新。
新信息。 我试过 Tomcat 7.0.61,错误是 ERR_CONNECTION_ABORTED 我用 Tomcat 6.0.43 试过了,没有错误!
最佳答案
经查,是Tomcat的问题。
In the version 7.0.55 was introduced the property maxSwallowSize默认设置为 2MB。这使得 Tomcat 中止上传请求。通过设置此属性 to another value问题已解决(我将其更改为 -1,请不要在您的 PRD 环境中这样做,因为 Tomcat 确实会尝试获取 X MB 文件进行上传)。我通过在我的连接器属性中添加我的 Tomcat 服务器文件 ${tomcat_dir}/conf/server.xml 属性 maxSwallowSize
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxSwallowSize="-1"/>
需要重启Tomcat才能使用这个配置,如果不行,删除服务器重新添加。
关于java - Tomcat在Spring中上传文件与允许的最大大小相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684691/