Apache Tomcat 设置最大文件上传大小

Apache Tomcat 设置最大文件上传大小

我正在实现一个 Grails/Groovy Web 应用程序,我想限制用户的文件上传大小,我不希望有人将 10GB 的文件上传到我的服务器。我发现大多数计算大小的方法都是在文件已上传后进行的,如果有人上传 10 个配置文件并上传 10 个 10GB 大小的文件会怎么样?这会耗尽服务器并占用服务器磁盘上的大量空间。所以我试图阻止这种情况。

我发现 Apache Tomcat 允许以下配置,无论是硬编码还是注释方法。我不确定最大文件大小是在上传过程中计算的还是在文件上传到临时位置后计算的。文档指出以下内容:

@MultipartConfig 注解支持以下可选属性:

location:文件系统上目录的绝对路径。location 属性不支持相对于应用程序上下文的路径。此位置用于在处理部分时或文件大小超过指定的 fileSizeThreshold 设置时临时存储文件。默认位置为“”。

fileSizeThreshold:文件大小(以字节为单位),超过该值后,文件将暂时存储在磁盘上。默认大小为 0 字节。

MaxFileSize:允许上传文件的最大大小,以字节为单位。如果任何上传文件的大小大于此大小,Web 容器将抛出异常(IllegalStateException)。默认大小为无限制。

maxRequestSize:multipart/form-data 请求允许的最大大小(以字节为单位)。如果所有上传文件的总大小超过此阈值,Web 容器将抛出异常。默认大小为无限制。

注释方法:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

这是硬编码值:

<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>

如果有人可以澄清 MaxFileSize 是否是在上传过程中计算的,我将不胜感激。

答案1

MaxFileSize 将在整个文件上传完成后计算。您可以在 Web 应用程序上上传一个文件(1GB 大小),然后您就会注意到实际发生了什么。因此,依赖 Tomcat 是没有意义的。在 Servlet 中执行相同的工作是可能的,但是当您的计数器达到 MaxFileSize 时,您如何断开底层 HTTP 连接?我认为您没有办法。HTTP 协议是单向的,因此您也无法告诉浏览器及时取消长帖子。您唯一能做的就是当您的计数器达到阈值时,忽略来自输入流的后续字节以保护磁盘空间,直到文件传输完成。

相关内容