如何在 Spring Boot 中更改 Multipart 文件的最大大小?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中更改 Multipart 文件的最大大小?【英文标题】:How to change the maximum size for a Multipart file in spring boot? 【发布时间】:2019-03-15 10:32:36 【问题描述】:

我尝试使用邮递员上传歌曲,但出现类似 字段歌曲超出其允许的最大大小 1048576 字节的错误。"

我已经尝试在 application.properties 文件中添加此配置,但它不起作用:

spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB

确切地说,这适用于大小为

这是我的控制器:

@PostMapping("/songs")
    public ResponseEntity<?> insertSong( @RequestParam(value = "title") String title, @RequestParam(value = "song") MultipartFile file) throws IOException 

       Song song= new Song(title);

        songService.insertSong(song, file);

        return ResponseEntity.ok("song inserted");
    

这是我的服务:

@Service
public class SongServiceImpl implements SongService 

    @Autowired
    SongRepository songRepository;

    @Value("$dir.songs")
    private  String songsFolderPath;

    @Override
    public void insertSong(Song song, MultipartFile file) throws IOException 
    

        if(!(file.isEmpty()))
            song.setSongPath(file.getOriginalFilename());
            songRepository.save(song);

            if (!(file.isEmpty()))
                song.setSongPath(file.getOriginalFilename());
                file.transferTo(new 
           File(songsFolderPath+song.getSong_ID()));
            
        
    

这是我的错误消息: "timestamp":"2018-10-10T13:27:07.090+0000","status":500,"error":"Internal Server Error","message":"最大上传大小超出;嵌套异常is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: 现场歌曲超过其最大允许大小 1048576 字节。","path":"/music-service/songs"

我使用微服务,我的配置在 gitLab 上,是这个:

我使用 postman 来插入 i 文件:

【问题讨论】:

您能告诉我们更多关于您的 Spring Boot 版本的信息吗? 在我的情况下没有答案 @flyordie 你找到答案了吗? 【参考方案1】:

对于 spring-boot 版本 2.x.x,通过包含 http 尝试使用以下代码。

spring.http.multipart.max-file-size=300MB
spring.http.multipart.max-request-size=300MB

参考set-maxfilesize

【讨论】:

我的答案不是投票-1而是阅读帖子,他已经有了这些设置。 @ValerioMC - 设置不一样,请注意 spring.http.* 与 spring.servlet.*。然而,他的回答也误导了 OP,因为 v2.x 版本(除了非常早期的 2.x beta 版本)使用了 OP 发布的设置,而 spring boot v1.x 版本使用了 spring.http.* 设置。但是,最可能的答案是 OP 使用 spring boot v1.x 并且这些设置应该可以工作,不管 Alien 自己遗漏了事实 我认为这个方法在 spring 2.0 Deprecated configuration property 'spring.http.multipart.max-file-size' more... (Ctrl+F1)987654323@【参考方案2】:

更新的 SpringBoot 2.0.0.RELEASE

Web 应用程序中的分段大小取决于两个单独的设置

1) 应用设置:通过application.properties中的Spring Boot配置实现

//SpringBoot 2.1.2.RELEASE
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

2) 服务器设置:此设置高于应用程序设置。在 Spring Boot 中,这个服务器配置可以通过两种方式完成

2.1) 在嵌入式 tomcat 中,正如您在以下链接中找到的 EMBEDDED_TOMCAT_MAX_SHALLOW_SIZE(部署 .war 文件时这还不够)(无需在 2.1.2.RELEASE 中执行此操作)

2.2) 在独立服务器中:在文件TOMCAT_HOME/conf/server.xml 中找到部分&lt;Connector port=“8080" 并添加属性maxSwallowSize=“-1"/&gt;

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxSwallowSize="-1"/>

使用-1,您将禁用服务器上的大小控制,现在只有 spring 应用程序上的设置才重要

此外,因为您正在处理文件,我认为您应该设置最适合您的 API 的 MediaType(在我的情况下,我有文件 + 额外的 json 元素)

@PostMapping(value = "/path", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

并在调用 REST-API 时尊重标头

headers.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE)

【讨论】:

我使用的是rest api,所以我用邮递员测试我认为我不需要表单method="POST" enctype="multipart/form-data" 我明白了。尝试更改maxShallowSize,它应该可以工作。 你知道如何改变它吗?因为没有属性,所以我看到了这个教程:mkyong.com/spring-boot/… 您发送的链接是针对嵌入式tomcat的,如果您将应用程序部署在外部服务器上,它仍然不起作用。更新答案,详细说明如何更改 maxSwallowSize 但目前我将使用嵌入的 tomcat。明天我将对其进行测试,然后我会返回答案【参考方案3】:

一个疯狂的猜测 - 您可能正在使用 spring boot 1.x,并且您可能正在尝试使用 spring boot 2.x 中的设置。

实现 spring boot v1.x 所需设置的正确属性如下:

spring.http.multipart.max-file-size=-1
spring.http.multipart.max-request-size=-1
spring.http.multipart.enabled=true

我的猜测是基于您在 config/properties 文件中设置了不同的文件大小,但您似乎遇到了默认值。

【讨论】:

以上是关于如何在 Spring Boot 中更改 Multipart 文件的最大大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中更改 Multipart 文件的最大大小?

如何在 Spring Boot 中更改允许的标头

如何在 Spring Boot Restful 中更改大量数据(更新多个数据)

Spring Boot Multi-Module maven 项目重新打包失败

带有 OAuth 的 Spring Boot Security Multi Http 不起作用

如何在运行时更改日志级别而不重新启动 Spring Boot 应用程序