我在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。这是默认行为还是我做错了什么?
答案 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;