Thymeleaf多文件输入未选择时发送空文件

时间:2018-07-13 10:24:28

标签: java validation spring-boot file-upload thymeleaf

我在Thymeleaf中输入了多个文件:

<div class="form-group">
    <label for="photos" class="control-label" th:text="#{projects.new.photos}">Photos</label>
    <input type="file" multiple="multiple" th:field="*{photos}" class="form-control" th:class=" ${#fields.hasErrors('photos')} ? 'form-control is-invalid' : 'form-control'" id="photos" name="photos" placeholder="Project Photos" th:placeholder="#{projects.new.photos.placeholder}">
    <div class="invalid-feedback" th:if="${#fields.hasErrors('photos')}" th:errors="*{photos}"> Error</div>
</div>

在我的验证器类中,我正在检查以下字段:

if(files.length == 0 && required==false) {
    return true;
}

该字段不是必需的,但是当我不选择任何文件时,在Spring启动应用程序中会得到一个文件数组,其中包含一项。因此上述代码段中的files数组的长度为1,并且验证无法按预期进行。 数组中唯一的项具有application / octet-stream的contentType,大小为-1。这是默认行为还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

更新:

我想我知道这是哪里来的。文件类型的输入字段的行为不像复选框类型的字段。即使未设置值,表单也会提交键值对。因此,控制器接收到这样的对,并且单个键-非值对由空的Multipart对象(此后称为“ mp1”)表示。由于您要将MultipartFile-objects数组定义为输入参数,因此Spring会将“ mp1”映射到length = 1的数组。就是这样。

原始答案:

我猜您正在使用org.springframework.web.multipart.MultipartFile []作为输入参数。我认为您应该通过以下方式检查是否存在/大小:

int size = 0;
for (MultipartFile file : files) 
{
   if (file != null && !file.isEmpty()) size++;
}

我一直对Multipart对象执行此null和附加的isEmpty检查,我在想原因是有时我得到了一个没有内容的MultipartFile对象。

编辑:如果您至少使用Java 8,则可以使用这种单行代码:

boolean empty = 
  Arrays.asList(files).stream().filter(f -> !f.isEmpty()).count() == 0;