【问题标题】:Spring: DTO file size validationSpring:DTO 文件大小验证
【发布时间】:2021-12-29 15:15:45
【问题描述】:

考虑两个控制器端点方法:

@RestController
public class MyController {

  @PostMapping("/foo")
  public ResponseEntity<?> foo(@Valid @RequestBody FooDto dto) {
    // ..
  }

  @PostMapping("/bar")
  public ResponseEntity<?> bar(@Valid @RequestBody BarDto dto) {
    // ..
  }
}

实际的dtos包含多部分对象,定义为:

class FooDto {

  @NotNull
  private MultipartFile file;

  @Size(min 2, max 40)
  private String name;
}

当然BarDto 也是如此。


目前,最大文件大小在 Spring 属性中全局定义为:

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

在理想情况下,我想从属性中控制每个单独的 dto 最大文件大小,例如如:

foo-dto.max-size=10MB
bar-dto.max-size=500MB

在不太理想的情况下,我想从 dto 类的内部控制大小,例如:

class BarDto {

  @FileSize(max = '500MB') // <-- something like this
  @NotNull
  private MultipartFile file;

  // ..
}

关于如何实现这一点的任何提示?是否存在与 Spring 兼容的文件验证注解?

【问题讨论】:

    标签: java spring validation multipart dto


    【解决方案1】:

    您可以通过implementing ConstraintValidator&lt;SizeConstraint, String&gt; 创建自己的注释,例如SizeConstraintValidator。在那里您可以验证任何参数,包括 MultiPartFile 的大小

    查看更多here

    【讨论】:

    • 恐怕在执行约束检查之前它不会阻止大文件上传。
    • 也许可以全局关闭 servlet 文件检查(允许无限文件大小),所以我可以依赖自定义验证器?
    • 自定义验证是一种正常的解决方案。所有验证器默认和自定义都将创建为 Spring bean。尝试检查 JMH 之前和之后的性能。如果有显着差异,我会感到非常惊讶
    • @weno 不,默认情况下,在 POST 中上传的文件首先保存在本地文件系统中,然后 Spring MVC 才会将检查委托给验证器。考虑到这一点,考虑您的全局限制设置为 1GB,但特定约束设置为 1Mb,但用户尝试上传 1GB 文件:999MB 的数据将被拒绝并在您的文件系统中保留一段时间(当然要花很多时间上传)。
    • 看看org.springframework.web.multipart.commons.CommonsMultipartResolverorg.apache.commons.fileupload.servlet.ServletFileUpload:我不得不在我之前的一个项目中扩展其中的两个来动态跟踪内容长度,以防止巨大的有效负载并拒绝例如无效文件(例如,允许用户仅上传 JPEG,但尝试上传文本文件)。我真的不记得他们是如何一起工作的,但这可能是关键。
    猜你喜欢
    • 2013-12-17
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2015-06-28
    • 2011-04-12
    相关资源
    最近更新 更多