使用 FileItemStream 流式传输文件时检查实际文件大小

Check real file size while streaming files with FileItemStream

我正在使用 Spring + apache commons 文件上传编写 API。

https://commons.apache.org/proper/commons-fileupload/

我遇到了一个问题。我需要验证文件大小。如果它比我配置的大,用户应该得到一个错误。 现在,我在没有检查的情况下实现了上传,它看起来像这样:

public ResponseEntity insertFile(@PathVariable Long profileId, HttpServletRequest request) throws Exception {
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator uploadItemIterator = upload.getItemIterator(request);
    if (!uploadItemIterator.hasNext()) {
        throw new FileUploadException("FileItemIterator was empty");
    }
    while (uploadItemIterator.hasNext()) {
        FileItemStream fileItemStream = uploadItemIterator.next();
        if (fileItemStream.isFormField()) {
            continue;
        }
       //do stuff
    }
    return new ResponseEntity(HttpStatus.OK);
}

它正是我所需要的。它不需要我将文件完全加载到内存中。我使用 InputStream 来进一步传输到另一个服务。最终,我在任何时候都没有将文件完全加载到内存中。 但是,这使我无法获得已加载的咬合总数。

有没有办法在不完全下载文件或将其保存在某处的情况下处理此类验证?

我尝试了 FileItem,但它确实需要完整加载文件。

ServletFileUpload 有一个方法 setSizeMax 控​​制每个请求接受的最大文件大小。为了减轻内存消耗问题,您可以使用 DiskFileFactory 为较大的文件设置磁盘文件存储。您必须始终获取文件,因为只信任 headers 是不可靠的,但我认为这可以完成工作:)