问题 以混合形式上传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;
}

但我不知道如何在视图/控制器端实现它。我可以自由混合弹簧形式的标签,如 <form:input> 像普通的标签 <input type=file ...>

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


5914
2018-02-03 09:22


起源



答案:


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

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


7
2018-02-15 13:58





看到 https://jira.springsource.org/browse/ROO-442 对于相关的Roo问题。


4
2018-02-17 21:29



已经投了赞成票。顺便说一句:很高兴看到你来到这里,Ben ;-) - er4z0r


答案:


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

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


7
2018-02-15 13:58





看到 https://jira.springsource.org/browse/ROO-442 对于相关的Roo问题。


4
2018-02-17 21:29



已经投了赞成票。顺便说一句:很高兴看到你来到这里,Ben ;-) - er4z0r


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

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

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


3
2018-02-03 09:59



谢谢回复。我会尝试并报告它是否有效。 - er4z0r
我如何使用现有实体执行此操作?我已经设法从mvc-docs为我工作的例子。但有问题的部分是:现在我的控制器方法中有byte [],我需要用它做一些事情;-)例如我有一个DataFile实体,现在我想将通过我的FileUploadController上传的byte []绑定到这样的实体并且在数据库中进行sotre。我该怎么办? - er4z0r


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


1
2018-02-17 18:12



我还没有考虑转换器/格式化器,但到目前为止注册CustomEditor对我来说似乎很容易。注意:我只需要注册它。我没有编写自定义属性编辑器的“快乐”;-) - er4z0r


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


0
2018-03-19 14:02