在 Servlet 中,"request.getParts().stream()..." 添加了一个 "empty" Part 对象

In Servlet the "request.getParts().stream()..." adds a "empty" Part object

在我的 JSP 中,我有一个用户可以上传文件的表单。

<form method="post" action="linkToAction" role="form" enctype="multipart/form-data">
  <input name="files" type="file" class="form-control-file" multiple="true" >
</form>

阅读此 answer,在我的 servlet 中,我上传了文件:

List<Part> fileParts = request.getParts().stream().filter(part -> "files".equals(part.getName())).collect(Collectors.toList());

如果用户没有上传任何东西,我希望 List<Part> fileParts 是空的!但是,它并不像上面的语句在列表fileParts中添加的那样,是一个空的Part。如果用户上传 1 个文件,上面的语句会再次添加 1 个有效的 Part 对象。

我想到的一个快速解决方案是检查文件名的长度:

for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); /
         if (fileName.length() != 0) {
                   //do my job here
         }
}

但是,为什么会这样呢?

您可以在 stream 本身检查空条件。

List<Part> fileParts = request.getParts().stream()
                                         .filter(part -> "files".equals(part.getName()) && Objects.nonNull(part.getName()))
                                         .collect(Collectors.toList());

您需要检查 Part#getSize() 是否大于 0

List<Part> nonEmptyFileParts = request.getParts().stream()
    .filter(part -> "files".equals(part.getName()) && part.getSize() > 0)
    .collect(Collectors.toList());

参考答案已更新,谢谢。