Grails3文件上传maxFileSize限制

Nam*_*ain 13 grails spring-boot grails-3.0

我试图更新文件上传maxFileSize为限Grails中3,并试图在配置上src/main/resources/application.properties,application.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)
Run Code Online (Sandbox Code Playgroud)

有关Grails 3应用程序中的位置和配置的任何帮助吗?

lif*_*foo 39

解决方案是在文件中设置maxFileSizemaxRequestSize限制application.yml.一定要有这样的东西:

grails:
    controllers:
        upload:
            maxFileSize: 2000000
            maxRequestSize: 2000000
Run Code Online (Sandbox Code Playgroud)

更换2000000最大的字节数,你想为一个文件上传和整个请求.Grails 3默认为128000(~128KB).



常问问题

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

YOUR_MAX_SIZE_IN_MB * 1024 * 1024 = BYTES
Run Code Online (Sandbox Code Playgroud)

例如,以字节为单位转换5 MB

5 * 1024 * 1024 = **5242880** bytes
Run Code Online (Sandbox Code Playgroud)

2.安全

正如OWASP引用的那样

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

因此存在这些限制以防止DoS攻击并强制执行整体应用程序性能(更大的请求大小==从服务器使用更多内存).

3.什么是正确的价值maxFileSizemaxRequestSize

这取决于应用程序类型,但保持它们太高通常是一个坏主意.如果您确实需要上传大文件,可能应该开发(或使用)专用(和分离)服务.


Jam*_*eeh 6

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

这是我的bean定义:

multipartResolver(MyMultipartResolver) {
    maxUploadSize = (5*1024*1024)
}
Run Code Online (Sandbox Code Playgroud)

这是我的实现:

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>());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

想法是检查控制器中的请求属性或过滤器以确定文件是否太大.


Mic*_*l B 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"
    }
}
Run Code Online (Sandbox Code Playgroud)