Grails3文件上传maxFileSize限制

Posted

技术标签:

【中文标题】Grails3文件上传maxFileSize限制【英文标题】:Grails3 file upload maxFileSize limit 【发布时间】:2015-07-02 23:11:57 【问题描述】:

我正在尝试更新 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 应用程序中配置的位置和内容有任何帮助吗?

【问题讨论】:

【参考方案1】:

Grails 3 和 4

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

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

2000000 替换为文件上传和整个请求所需的最大字节数。 Grails 3 和 Grails 4 default 为 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 一起工作? ***.com/questions/61892143/…【参考方案2】:

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

这是我的 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>());
        
    

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

【讨论】:

当我这样做时,限制内的文件丢失了。你知道怎么回事吗?【参考方案3】:

我也没有运气尝试在 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"
    

【讨论】:

我试过这个,它需要类路径“commons-fileupload:commons-fileupload:1.2.1”上的公共文件上传库。它仍然失败,但有同样的例外。有什么额外的设置吗? 我不需要额外的设置,也不需要依赖 commons-fileupload。您的应用程序中肯定发生了其他事情。 我添加了这个:compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3' BTW,只有这个似乎有效。它忽略了其他设置(Grails 3.2.11)。 我将此答案与依赖项注释结合使用。解决了错误,但现在请求中的文件为空。 我还在 Grails 3.3.10 的请求中得到一个空文件【参考方案4】:

试试这个 https://github.com/zyro23/grails-core-668/blob/master/grails-app/conf/application.yml

上传: 最大文件大小:9999999999 最大请求大小:9999999999

【讨论】:

完整说明请参见my answer。【参考方案5】:

https://github.com/grails/grails-core/issues/668

grails.controllers.upload.maxFileSize

和/或

grails.controllers.upload.maxRequestSize 

配置属性/设置

【讨论】:

【参考方案6】:

以下内容对我有用(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

【讨论】:

文件大于最大值时如何处理异常?

以上是关于Grails3文件上传maxFileSize限制的主要内容,如果未能解决你的问题,请参考以下文章

springboot 文件上传大小配置

《SpringBoot上传文件大小》

每日灵魂一问-如何实现文件上传?

如何限制 dropzone.js 中的最大“总”文件大小?

spring boot 文件上传 文件过大 FileUploadBase$SizeLimitExceed

application.yml或properties常见配置之文件上传