【问题标题】:Uploading multiple files does not work in spring boot controller上传多个文件在spring boot控制器中不起作用
【发布时间】:2020-07-10 04:32:10
【问题描述】:

我可以像这样将一个文件上传到 Spring Boot 控制器:

@RequestMapping(value = "/projects",
    produces = { "application/json" },
    consumes = { "multipart/form-data" },
    method = RequestMethod.POST)
public ResponseEntity<Void> upload(@RequestParam(value="file", required=false) MultipartFile files)) {
    //
}

但我无法将多个文件上传到类似的 spring boot 控制器:

@RequestMapping(value = "/projects",
    produces = { "application/json" },
    consumes = { "multipart/form-data" },
    method = RequestMethod.POST)
public ResponseEntity<Void> upload(@RequestParam(value="files", required=false) MultipartFile[] files)) {
    //
}
@RequestMapping(value = "/projects",
    produces = { "application/json" },
    consumes = { "multipart/form-data" },
    method = RequestMethod.POST)
public ResponseEntity<Void> upload(@RequestParam(value="files", required=false) List<MultipartFile> files)) {
    //
}

*当我尝试上传文件时,上面的两个控制器有空列表或数组

我是否需要在我的 Spring Boot 中进行一些额外的配置才能上传多个文件?

【问题讨论】:

    标签: java spring-boot file-upload


    【解决方案1】:

    这是我的测试项目配置:

    1. pom.xml

       <?xml version="1.0" encoding="UTF-8"?>
       <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
           <modelVersion>4.0.0</modelVersion>
           <parent>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-parent</artifactId>
               <version>2.2.5.RELEASE</version>
               <relativePath/> <!-- lookup parent from repository -->
           </parent>
           <groupId>com.example</groupId>
           <artifactId>multipart-demo</artifactId>
           <version>0.0.1-SNAPSHOT</version>
           <name>multipart-demo</name>
           <description>Demo project for Spring Boot</description>
      
           <properties>
               <java.version>11</java.version>
           </properties>
      
           <dependencies>
               <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-web</artifactId>
               </dependency>
      
               <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-test</artifactId>
                   <scope>test</scope>
                   <exclusions>
                       <exclusion>
                           <groupId>org.junit.vintage</groupId>
                           <artifactId>junit-vintage-engine</artifactId>
                       </exclusion>
                   </exclusions>
               </dependency>
           </dependencies>
      
           <build>
               <plugins>
                   <plugin>
                       <groupId>org.springframework.boot</groupId>
                       <artifactId>spring-boot-maven-plugin</artifactId>
                   </plugin>
               </plugins>
           </build>
      
           <repositories>
               <repository>
                   <id>spring-milestones</id>
                   <name>Spring Milestones</name>
                   <url>https://repo.spring.io/milestone</url>
               </repository>
               <repository>
                   <id>spring-snapshots</id>
                   <name>Spring Snapshots</name>
                   <url>https://repo.spring.io/snapshot</url>
                   <snapshots>
                       <enabled>true</enabled>
                   </snapshots>
               </repository>
           </repositories>
           <pluginRepositories>
               <pluginRepository>
                   <id>spring-milestones</id>
                   <name>Spring Milestones</name>
                   <url>https://repo.spring.io/milestone</url>
               </pluginRepository>
               <pluginRepository>
                   <id>spring-snapshots</id>
                   <name>Spring Snapshots</name>
                   <url>https://repo.spring.io/snapshot</url>
                   <snapshots>
                       <enabled>true</enabled>
                   </snapshots>
               </pluginRepository>
           </pluginRepositories>
      
       </project>
      
    2. MultipartDemoApplication.java

       package com.example.multipartdemo;
      
       import org.springframework.boot.SpringApplication;
       import org.springframework.boot.autoconfigure.SpringBootApplication;
      
       @SpringBootApplication
       public class MultipartDemoApplication {
      
           public static void main(String[] args) {
               SpringApplication.run(MultipartDemoApplication.class, args);
           }
       }
      
    3. FileUploadController.java

       package com.example.multipartdemo;
      
       import org.springframework.http.HttpStatus;
       import org.springframework.http.ResponseEntity;
       import org.springframework.stereotype.Controller;
       import org.springframework.web.bind.annotation.RequestMapping;
       import org.springframework.web.bind.annotation.RequestMethod;
       import org.springframework.web.bind.annotation.RequestParam;
       import org.springframework.web.multipart.MultipartFile;
      
       import java.util.Arrays;
       import java.util.stream.Collectors;
      
       @Controller
       public class FileUploadController {
           @RequestMapping(value = "/projects",
                   produces = {"application/json"},
                   consumes = {"multipart/form-data"},
                   method = RequestMethod.POST)
           public ResponseEntity<String> uploadFiles(@RequestParam(value = "files", required = false) MultipartFile[] files) {
               try {
                   String fileNames = Arrays.stream(files)
                           .map(MultipartFile::getOriginalFilename)
                           .collect(Collectors.joining(" : "));
                   return ResponseEntity.status(HttpStatus.OK).body(fileNames);
               } catch (Exception e) {
                   return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body("Unable to download files");
               }
           }
      
           @RequestMapping(value = "/projects",
                   produces = {"text/plain"},
                   method = RequestMethod.GET)
           public ResponseEntity<String> uploadFiles() {
               return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body("OK");
           }
       }
      
    4. application.properties

       spring.servlet.multipart.max-file-size=100KB
       spring.servlet.multipart.max-request-size=500KB
      

    启动应用程序后,它按预期工作:

    只有在body不存在的情况下我才得到下一个响应,但这是调试的另一个故事。

    那么,你能检查一下你的配置吗?和我的有什么区别?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2011-07-25
      • 2016-01-24
      相关资源
      最近更新 更多