Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用FileItemStream流式处理文件时检查实际文件大小_Java_Spring Mvc_Servlets_File Upload_Apache Commons Fileupload - Fatal编程技术网

Java 使用FileItemStream流式处理文件时检查实际文件大小

Java 使用FileItemStream流式处理文件时检查实际文件大小,java,spring-mvc,servlets,file-upload,apache-commons-fileupload,Java,Spring Mvc,Servlets,File Upload,Apache Commons Fileupload,我正在使用Spring+ApacheCommons文件上传编写一个API 我面临着一个问题。我需要验证文件大小。若它比我配置的那个大,那个么用户应该会得到一个错误。 现在,我在没有检查的情况下实现了上传,结果如下: public ResponseEntity insertFile(@PathVariable Long profileId, HttpServletRequest request) throws Exception { ServletFileUpload upload =

我正在使用Spring+ApacheCommons文件上传编写一个API

我面临着一个问题。我需要验证文件大小。若它比我配置的那个大,那个么用户应该会得到一个错误。 现在,我在没有检查的情况下实现了上传,结果如下:

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为较大的文件设置磁盘文件存储。您必须始终获取这些文件,因为仅信任标题是不可靠的,但我认为这可以完成任务:)

这一个可以完成任务。谢谢我理解不信任邮件头的所有重要性。然而,在我的情况下,我没有选择。我传输到的服务应该会失败,我在这里的工作只是为用户提供一个用户友好的异常,并且在传输文件时不执行所有其他工作。似乎只有在处理部分文件时才会发生异常。因此,如果最大大小为5GB,我需要先处理5GB,以了解文件是否符合我的要求。我希望在验证阶段(上传之前)应该有一种说法,你可以在发送之前在服务的客户端上检查它。你也在发展吗?HTML+JavaScript对吗?它是上传形式吗?我们的前端使用JS。基本上是反应。对这是可能的,但这是一个好的做法吗?我的意思是,有人可以在不使用前端的情况下,将大量的系统流文件加载到后端。只是使用RESTAPI。是的,不会保存文件,但会在服务器上加载。如果前面有appache服务器,则可以添加LimitRequestBody指令,以控制其接受的请求的最大大小。对于5gB LimitRequestBody 5242880000