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

时间:2017-06-26 11:36:15

标签: java spring-mvc servlets file-upload apache-commons-fileupload

我正在使用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,但确实需要完整加载文件。

1 个答案:

答案 0 :(得分:1)

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

相关问题