我正试图找到一种限制用户可以上传的文件大小的方法。我需要满足以下条件:
- 我可以使用客户端文件大小检测,但可以绕过。所以服务器端更可取。 - 我希望能够在上传开始之前找出文件大小,或者如果不可能,我应该能够在流式传输时设置大小限制,所以如果流达到限制,它就会停止并且不会t再次接收来自客户端的流。 (我看到Apache有一个我可以使用的最大限制,但我想知道我是否可以使用Spring / Grails来做到这一点)
有没有办法在Grails中优雅地完成这项工作?
P.S:我注意到“multipartResolver”可以设置文件上传的限制,multipartResolver首先上传然后检查或者在实际完全下载文件之前检查大小吗?
答案 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,我感激不尽。