我想上传一个文件到我的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;
}
但我不知道如何在视图/控制器端实现它。我可以自由混合弹簧形式的标签,如 <form:input>
像普通的标签 <input type=file ...>
?
我看到了很好的 分段上传部分 在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();
}
}
更新:我认为我的问题制定得很糟糕。我想做的是创造一个弹簧
我在旧的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();
}
}
我不相信你可以将文件上传与普通表格混合搭配(至少在Spring MVC中),因为文件上传表格使用 multipart/form-data
编码,而不是通常的 application/x-www-form-urlencoded
。
当你指定 multipart/form-data
,然后在Spring,你需要使用一个 MultipartResolver
实现(如您链接到的Spring文档中所述),并且所有参数解码都必须经历。 Spring MVC将无法解码普通表单输入,因为所有字段都将与上传的文件一起编码。
使用两个单独的表单几乎肯定更容易,一个用于普通的东西,一个用于文件上传。
如果您使用的是Spring 3.0,那么您可以创建一个转换器和一个Formatter(可选)并且您不必使用initBinder方法,并且保持更多POJO,但您的解决方案仍然非常有效并且仍然非常干净。
您需要有两个表单,一个用于上载文件,另一个用于上载数据。我想到这一点,因为文件是大档案或小文件,因为这种情况不起作用。