Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation spring多部分文件上载表单验证_Validation_Spring Mvc_Multipartform Data - Fatal编程技术网

Validation spring多部分文件上载表单验证

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

我是spring的新手,目前正在努力解决获取多部分表单提交/验证场景所需的许多问题,视图中显示了错误

以下是我目前拥有的文件:

resourceupload.jsp:显示上载文件的表单的视图

<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";
    }
}