Raw Spring 5和Commons FileUpload无法正常工作

时间:2018-12-13 21:01:09

标签: java spring spring-mvc multipartform-data apache-commons-fileupload

我正在重构一些用于使用Commons Fileupload和JSP上传文件的旧代码,以使用Spring Controllers。鉴于很多文件上传代码都基于Commons Fileupload,因此我想重用该代码。第一次尝试是将代码从JSP直接移到Spring Controller,如下所示:

    @RequestMapping(path = { "/my/file/upload/request/mapping" })
    public ModelAndView myControllerMethod(HttpServletRequest request, HttpServletResponse response){

    List<FileItem> items = null;
    if (ServletFileUpload.isMultipartContent(request)) {
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        items = upload.parseRequest(request);
        System.out.println("number of items: " + (items !=  null ? items.size() : "null"));
    }
    ...

尽管程序输入if,并将其识别为多部分请求,但始终显示number of items: 0

我包括了一个MultipartViewResolver,如下:

@Configuration
@EnableWebMvc
@SuppressWarnings("deprecation")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter{

    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(maxFileUploadSizeBytes);

        return multipartResolver;
    }

但是无论有没有结果都是相同的。

正如许多地方所述(例如here (Baeldung)here (SO)),Commons Fileupload似乎无法读取多部分,因为它已被Spring读取。因此,解决方案似乎是禁用Spring多部分支持。许多帖子讲述了如何在Spring Boot中执行此操作,但我不知道如何在原始Spring 5中执行该操作。关于如何做的任何想法?

注意:我还尝试使用 Spring方式获取多部分文件,如下所示:

@RequestMapping(path = { "/my/file/upload/request/mapping" })
public ModelAndView myControllerMethod(@RequestParam MultipartFile file){

甚至@RequestParam MultipartFile[] files,但我分别获得了空文件或空文件数组。再次,我已经使用Firefox控制台检查了所发出的请求与旧的JSP代码完全相同,后者起作用了,因此问题不在发出的请求中

2 个答案:

答案 0 :(得分:1)

您缺少要绑定到的请求参数的名称

请参阅spring的Java文档here

例如

@RequestParam("file") MultipartFile multipartFile 

“文件”是您的 JSP 中的请求参数的名称。

<input type="file" name="file"><br />

并确保您也使用 POST方法

@RequestMapping(value = "/my/file/upload/request/mapping", method = RequestMethod.POST)

答案 1 :(得分:0)

确保您的表单具有 enctype =“ multipart / form-data” ;

<form enctype="multipart/form-data" >

</form>

之后,您的请求参数需要更正为;

@RequestParam(“ file”)MultipartFile文件

不是您可以使用以下条件进行测试,并将多部分存储在字节数组中

if(file.isEmpty()){
 byte [] bytefile= file.getBytes();
}
else{
   logger.info("not caught");
}