如何在Spring Boot中使用MultipartConfigElement一次上传多个文件?

时间:2014-09-05 08:45:04

标签: spring spring-mvc spring-boot jquery-file-upload

我正在使用带有CommonsMultipartResolver的Spring Boot 1.1.3来允许一次上传多个文件。

当我尝试上传大于1 MB的文件时,我得到了这个堆栈跟踪:

Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: 
The field files[] exceeds its maximum permitted size of 1048576 bytes.
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:637)
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76)
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)

我尝试设置这样的最大上传大小:

public MultipartResolver multipartResolver()
{
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setMaxUploadSize( 100 * MEGABYTE_IN_BYTES );
    return resolver;
}

然而,这不起作用。我找到了这个Spring guide on upoading files并在那里使用MultipartConfigFactory代替。但是,我现在需要在我的控制器中使用MultipartFile类而不是MultipartHttpServletRequest

使用MultipartHttpServletRequest我可以getFileMap()获取所有文件,但MultipartFile上没有此类方法。

有关如何使用MultipartConfigFactory和多个文件的任何想法?我在客户端上使用jquery-file-upload,如果这很重要的话。

4 个答案:

答案 0 :(得分:7)

增加上传限制的正确方法是设置属性
multipart.maxFileSize=10Mb
application.properties文件中。您可以在此处详细了解此主题 https://stackoverflow.com/a/27062232/668417 和这里 MultipartProperties.java

答案 1 :(得分:3)

有关Spring Boot 1.1.3的问题。随着时间的推移,已接受的解决方案不再适用于较新版本的Spring Boot。但是,增加最大允许上载大小的问题仍然存在。

我从Spring Boot 1.4.2开始写这个,所以这个解决方案可能永远不正确。

从春季指南到uploading files,新属性就是:

spring.http.multipart.max-file-size=10Mb
spring.http.multipart.max-request-size=10Mb

答案 2 :(得分:1)

似乎无需在Controller中使用MultipartFile,您也可以使用MultipartHttpServletRequest。这是我的@RestController注释类的签名:

@RequestMapping(value = "/{datasheetId}/addDoc", method = RequestMethod.POST)
@Secured(ROLE_USER)
public ResponseEntity<?> addDocumentToDatasheet( Principal principal,
                                                 @PathVariable("datasheetId") long datasheetId,
                                                 MultipartHttpServletRequest request ) throws IOException
{
     Map<String, MultipartFile> fileMap = request.getFileMap();
     // handle fileMap further...
}

答案 3 :(得分:1)

对于我的项目中的大小问题,我在application.properties中使用了这个属性:

multipart.max-file-size=100Mb
multipart.max-request-size=100Mb

对于有多个文件的情况我建议使用像这样的bean

@Data
class MultipartDTO{

    private MultipartFile file1; 
    private MultipartFile file2;
    .....
    private MultipartFile filen; 

    //eventually other proerties
}

当然,在你的控制器中,你的colud有这样的东西

@RequestMapping(value = "/multipartUrl", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity multipartCall(MultipartDTO multipartDTO){
    ....
}

我希望这可以帮到你