Grails3文件上传的最大文件大小限制

20

我正在尝试更新Grails 3中文件上传的maxFileSize限制,并尝试在src/main/resources/application.propertiesapplication.groovyapplication.yml中配置,但仍然抛出异常。

Class
    org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException
Message
    the request was rejected because its size (154738) exceeds the configured maximum (128000)

请问在Grails 3应用程序中,配置需要注意什么和在哪里进行配置?


在application.yml中设置限制很容易,但当超过最大文件大小时处理异常是困难的部分,提供的解决方案似乎都不起作用,但这里有一个解决方案:https://mkyong.com/spring/spring-mvc-how-to-handle-max-upload-size-exceeded-exception/。 - Pablo Pazos
6个回答

54

Grails 3,Grails 4,Grails 5和Grails 6

解决方案是在您的application.yml文件(通常放置在grails-app/conf/中)中设置maxFileSizemaxRequestSize限制。确保有类似以下内容的配置:

grails:
    controllers:
        upload:
            maxFileSize: 2000000
            maxRequestSize: 2000000

将文件上传和整个请求要使用的最大字节数量 2000000 替换为你想要的数字。在Grails 3Grails 4Grails 5 Grails 6 默认情况下,默认值是128000(约128KB)。



1. 如何将MB转换为字节?

YOUR_MAX_SIZE_IN_MB * 1024 * 1024 = BYTES

例如:将5 MB转换为字节

5 * 1024 * 1024 = **5242880** bytes

2. 安全性

正如OWASP所说:

限制文件大小的最大值,以防止拒绝服务攻击

因此,这些限制存在是为了预防DoS攻击,并强制执行整个应用程序的性能(更大的请求大小==从服务器使用更多内存)。

3. maxFileSizemaxRequestSize的合适值是多少?

这取决于应用程序类型,但通常保持它们不要太高是一个不好的主意。如果您确实需要上传大文件,也许您应该开发(或使用)一个专用的(并且独立的)服务。


这在Grails 4中如何工作?https://stackoverflow.com/questions/61892143/multipart-file-upload-maxfilesize-exceeded - Lastone
问题的关键在于如何处理SizeLimitExceededException异常,因为任何可以设置的值都可能被违反。 - Pablo Pazos
不,@PabloPazos,原帖明确询问如何配置大小限制。你正在谈论另一个主题——异常处理。 - lifeisfoo
配置完成后异常仍会发生,只需上传一个更大的文件,因此这仍然是问题的一部分。 - Pablo Pazos

7

问题的一部分是设置最大文件大小。另一个问题是优雅地处理该错误。

这是我的bean定义:

multipartResolver(MyMultipartResolver) {
    maxUploadSize = (5*1024*1024)
}

这是我的实现:

public class MyMultipartResolver extends CommonsMultipartResolver {

    static final String FILE_SIZE_EXCEEDED_ERROR = "fileSizeExceeded";

    public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) {
        try {
            return super.resolveMultipart(request);
        } catch (MaxUploadSizeExceededException e) {
            request.setAttribute(FILE_SIZE_EXCEEDED_ERROR, true);
            return new DefaultMultipartHttpServletRequest(request, new LinkedMultiValueMap<String, MultipartFile>(), new LinkedHashMap<String, String[]>(), new LinkedHashMap<String, String>());
        }
    }
}

这个想法是检查你的控制器或过滤器中的请求属性,以确定文件是否过大。


当我这样做时,范围内的文件丢失了。你知道出了什么问题吗? - ricardogobbo

4
我尝试在application.properties或application.yml中设置新的最大值,但没有成功。
不过,在conf/spring/resources.groovy中使用bean定义是可行的。
import javax.servlet.MultipartConfigElement

// Place your Spring DSL code here
beans = {
   multipartResolver(org.springframework.web.multipart.commons.CommonsMultipartResolver){
        maxInMemorySize=1000000
        maxUploadSize=100000000
        //uploadTempDir="/tmp"
    }
}

1
我尝试了这个,需要在类路径上添加commons-file-upload库'commons-fileupload:commons-fileupload:1.2.1'。但它仍然出现相同的异常。是否有其他的设置? - Naman Jain
我不需要额外的设置,也不需要依赖于commons-fileupload。你的应用程序中一定有其他问题。 - Michael B
1
我添加了这个: compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3' 顺便说一下,只有这个似乎起作用。它忽略了其他设置 (Grails 3.2.11)。 - Nathan Dunn
我将此答案与依赖项评论结合使用。已解决错误,但现在请求中的文件为空。 - IgniteCoders
在Grails 3.3.10上,我也会在请求中得到一个空文件。 - Pablo Pazos

3

3

请参见我的答案以获取完整的解释。 - lifeisfoo

0

以下内容适用于我(grails 3.3.9):
conf/spring/resources.groovy

import org.springframework.web.multipart.commons.CommonsMultipartResolver

// Place your Spring DSL code here
beans = {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(2000000)
}

MyFile.groovy领域中

package attainrvtwo

class MyFile {

    byte[] myFile

    static constraints = {
        myFile(maxSize: 2000000)
    }
}

conf/application.yml 的末尾

---
grails:
  controllers:
    upload:
      maxFileSize: 2000000
      maxRequestSize: 2000000

当文件大小超过最大值时,您如何处理异常? - Pablo Pazos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接