以混合形式上传Spring文件

时间:2010-02-03 09:22:48

标签: java spring file-upload spring-mvc

我想将文件上传到我的spring 3.0应用程序(使用roo创建)。

我已经拥有以下实体:

@Entity
@RooJavaBean
@RooToString
@RooEntity
public class SelniumFile {

    @ManyToOne(targetEntity = ShowCase.class)
    @JoinColumn
    private ShowCase showcase;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] file;

    @NotNull
    private String name;
}

但我不确定如何在视图/控制器端实现它。我可以自由地将<form:input>等弹簧式标签与<input type=file ...>等常规标签混合使用吗?

我在MVC文档中看到了很好的multipart upload section,但仍需要一点帮助才能将它应用到我的特定情况。

5 个答案:

答案 0 :(得分:7)

更新:我认为我的问题制定得很糟糕。我想做的是创造一个弹簧

我在旧的spring文档中找到了一个非常好的解释,并将它应用到新的Spring 3.0 MVC中。基本上这意味着您需要在控制器@InitBinder方法中注册PropertyEditor。之后一切都将按预期运行(前提是您已将MultiPartResolver添加到上下文并设置正确的表单编码)。 这是我的样本:

@RequestMapping("/scriptfile/**")
@Controller
public class ScriptFileController {

    //we need a special property-editor that knows how to bind the data
    //from the request to a byte[]
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
    }

    @RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
    public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
        if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
        if (result.hasErrors()) {        
            modelMap.addAttribute("scriptFile", scriptFile);            
            modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
            return "scriptfile/create";            
        }        
        scriptFile.persist();        
        return "redirect:/scriptfile/" + scriptFile.getId();        
    }    
}

答案 1 :(得分:4)

请参阅https://jira.springsource.org/browse/ROO-442了解相关的Roo问题。

答案 2 :(得分:3)

我不相信你可以将文件上传与普通表格混合搭配(至少在Spring MVC中),因为文件上传表单使用的是multipart/form-data编码,而不是通常的{{1} }。

当您指定application/x-www-form-urlencoded时,在Spring中您需要使用multipart/form-data实现(如您链接到的Spring文档中所述),并且所有参数解码都必须通过该实现。 Spring MVC将无法解码普通表单输入,因为所有字段都将与上传的文件一起编码。

使用两个单独的表单几乎肯定更容易,一个用于普通的表单,一个用于文件上传。

答案 3 :(得分:1)

如果您使用的是Spring 3.0,那么您可以创建一个转换器和一个Formatter(可选)而且您不必使用initBinder方法,并保持更多POJO,但您的解决方案仍然非常有效且仍然非常干净

答案 4 :(得分:0)

您需要有两个表单,一个用于上传文件,另一个用于上传数据。我认为这是因为文件是大档案或者文件,因为这种情况不会很容易。