以混合forms上传Spring文件

我想上传一个文件到我的spring 3.0 applicatoin(用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; } 

但我不知道如何在视图/控制器端实现它。 我可以自由地将弹簧forms的标签(如

与普通标签(如吗?

我已经在MVC文档中看到了很好的分段上传部分 ,但仍需要一些帮助才能将它应用到我的特定情况。

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

我在旧的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(); } } 

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

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

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

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

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

您需要有两个表单,一个用于上载文件,另一个用于上载数据。 我想到这一点,因为文件是大档案或小文件,因为这种情况不起作用。