Grails,将文件上传大小限制为几兆字节

时间:2013-12-26 17:52:59

标签: spring apache tomcat grails file-upload

我正试图找到一种限制用户可以上传的文件大小的方法。我需要满足以下条件:

- 我可以使用客户端文件大小检测,但可以绕过。所以服务器端更可取。 - 我希望能够在上传开始之前找出文件大小,或者如果不可能,我应该能够在流式传输时设置大小限制,所以如果流达到限制,它就会停止并且不会t再次接收来自客户端的流。 (我看到Apache有一个我可以使用的最大限制,但我想知道我是否可以使用Spring / Grails来做到这一点)

有没有办法在Grails中优雅地完成这项工作?

P.S:我注意到“multipartResolver”可以设置文件上传的限制,multipartResolver首先上传然后检查或者在实际完全下载文件之前检查大小吗?

3 个答案:

答案 0 :(得分:0)

知道您使用自己的代码进行上传,我假设您的域中有一个字段可以保存文件。如果是这样,那么您可以在域类的静态约束中添加maxSize属性。

示例:

class Files {

  byte[] uploadedFile


static constraints = {
uploadedFile(nullable:true, maxSize: 10 * 1024 * 1024)

}
}

它对我有用。我希望它有所帮助。

答案 1 :(得分:0)

我已经就文件大小回答了类似的问题here。如果将文件存储在文件系统而不是数据库中的blob中,这将是一个很好的用法。我不知道何时检查文件的大小。

我认为只有在文件完全上传后才能执行此操作。我没看到你在流式传输时如何检测到它,因为服务器没有所有字节来计算大小。

JavaScript在上传之前无法检测文件的大小。如果你想要做这个客户端,你将不得不考虑一个闪存类型的解决方案。

答案 2 :(得分:0)

Apache Tomcat允许以硬编码或注释格式进行以下配置。我不确定在上传过程中或文件上传到临时位置后是否计算了max-file-size。文档说明如下:

  

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

     

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

     

fileSizeThreshold:文件的文件大小(以字节为单位)   暂时存储在磁盘上。默认大小为0字节。

     

MaxFileSize:上传文件允许的最大大小(以字节为单位)。如果   任何上传文件的大小都大于此大小,即网络   容器将抛出异常(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,我感激不尽。