Validation spring多部分文件上载表单验证
我是spring的新手,目前正在努力解决获取多部分表单提交/验证场景所需的许多问题,视图中显示了错误 以下是我目前拥有的文件: resourceupload.jsp:显示上载文件的表单的视图Validation spring多部分文件上载表单验证,validation,spring-mvc,multipartform-data,Validation,Spring Mvc,Multipartform Data,我是spring的新手,目前正在努力解决获取多部分表单提交/验证场景所需的许多问题,视图中显示了错误 以下是我目前拥有的文件: resourceupload.jsp:显示上载文件的表单的视图 <form:form method="post" action="resource/upload" enctype="mutlipart/form-data"> <input name="name" type="text"/> <input name="file" type
<form:form method="post" action="resource/upload" enctype="mutlipart/form-data">
<input name="name" type="text"/>
<input name="file" type="file" />
<input type="submit"/>
<form:errors path="file" cssClass="errors"/>
</form>
现在,显然这种方法有问题:
1/我必须在validationErrors参数之前添加一个伪“command”对象,否则spring会向我抛出一个错误。这似乎不太对
2/添加该参数后,重定向不会将错误传递给视图。我尝试在控制器开始时使用@SessionAttribute(“文件”),但没有成功
如果有人能帮忙。。。我已经看过@ResponseBody注释,但它似乎没有用于视图。似乎是我自己找到的解决方案 首先,这个链接帮助了我很多: 和 这显示了一个显示所有错误的好技巧,使用
<form:errors path="*"/>.
希望能有所帮助。我不认为这种方法完全支持spring,但它很有效,很简单,使用简单的html表单和控制器中的一种方法: 做文章的html文件(另存为jsp或html,由您调用) 要使更大的文件可上载(超过40k),您可能需要在SpringServlet配置中指定以下内容。。。。我在那里放了一些大的#,以确保它能正常工作,但如果需要的话,当然要放上“真实”的数字
<!-- Configure the multipart resolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="500000000"/>
<property name="maxInMemorySize" value="500000000" />
</bean>
请注意,Spring的文件上传工具是在封面下使用的。你需要下载并将其包含在你的应用程序中。这反过来也需要,所以你也需要。(引自)这里有一个非常简单的方法: formBackingObject:
import org.springframework.web.multipart.commons.CommonsMultipartFile;
public class FileImport {
CommonsMultipartFile importFile;
public CommonsMultipartFile getImportFile() {
return importFile;
}
public void setImportFile(CommonsMultipartFile importFile) {
this.importFile = importFile;
}
}
表格:
<sf:form method="POST" modelAttribute="fileImport" enctype="multipart/form-data" action="import">
<table>
<spring:hasBindErrors name="fileImport">
<tr>
<td colspan="2">
<sf:errors path="importFile" cssClass="error"/>
</td>
</tr>
</spring:hasBindErrors>
<tr>
<th><label for="importFile">Import Workload:</label></th>
<td><input name="importFile" type="file"></td>
</tr>
</table>
<input type="submit" value="Import Application Data">
</sf:form>
轻松点
@NotNull注释不适用于文件的原因是,请求对象中的多部分文件从不为null。但是,它可以有0个字节。您可以花时间实现自定义验证器,但为什么呢 在Spring 4中,您可以实现文件验证程序,如下所示:
@Component
public class FileValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return FileModel.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
FileModel fileModel = (FileModel) target;
if (fileModel.getFile() != null && fileModel.getFile().isEmpty()){
errors.rejectValue("file", "file.empty");
}
}
}
此实现帮助您的代码更清晰、可读性更强。我从教程中找到的
<!-- Configure the multipart resolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="500000000"/>
<property name="maxInMemorySize" value="500000000" />
</bean>
import org.springframework.web.multipart.commons.CommonsMultipartFile;
public class FileImport {
CommonsMultipartFile importFile;
public CommonsMultipartFile getImportFile() {
return importFile;
}
public void setImportFile(CommonsMultipartFile importFile) {
this.importFile = importFile;
}
}
<sf:form method="POST" modelAttribute="fileImport" enctype="multipart/form-data" action="import">
<table>
<spring:hasBindErrors name="fileImport">
<tr>
<td colspan="2">
<sf:errors path="importFile" cssClass="error"/>
</td>
</tr>
</spring:hasBindErrors>
<tr>
<th><label for="importFile">Import Workload:</label></th>
<td><input name="importFile" type="file"></td>
</tr>
</table>
<input type="submit" value="Import Application Data">
</sf:form>
@RequestMapping(value={"/import"}, method=RequestMethod.POST)
public String importWorkload(
FileImport fileImport, BindingResult bindResult,
@RequestParam(value="importFile", required=true) MultipartFile importFile ){
if( 0 == importFile.getSize() ){
bindResult.rejectValue("importFile","fileImport.importFile");
}
if(bindResult.hasErrors()){
return "admin";
}
....
}
@Component
public class FileValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return FileModel.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
FileModel fileModel = (FileModel) target;
if (fileModel.getFile() != null && fileModel.getFile().isEmpty()){
errors.rejectValue("file", "file.empty");
}
}
}
@Controller
@RequestMapping("/")
public class FileUploadController {
@Autowired
private FileValidator fileValidator;
@ModelAttribute
public FileModel fileModel(){
return new FileModel();
}
@InitBinder
protected void initBinderFileModel(WebDataBinder binder) {
binder.setValidator(fileValidator);
}
@RequestMapping(method = RequestMethod.GET)
public String single(){
return "index";
}
@RequestMapping(method = RequestMethod.POST)
public String handleFormUpload(@Valid FileModel fileModel,
BindingResult result,
RedirectAttributes redirectMap) throws IOException {
if (result.hasErrors()){
return "index";
}
MultipartFile file = fileModel.getFile();
InputStream in = file.getInputStream();
File destination = new File("/tmp/" + file.getOriginalFilename());
FileUtils.copyInputStreamToFile(in, destination);
redirectMap.addFlashAttribute("filename", file.getOriginalFilename());
return "redirect:success";
}
}