Grails3文件上传maxFileSize限制
Posted
技术标签:
【中文标题】Grails3文件上传maxFileSize限制【英文标题】:Grails3 file upload maxFileSize limit 【发布时间】:2015-07-02 23:11:57 【问题描述】:我正在尝试更新 Grails 3 中的文件上传 maxFileSize 限制,并尝试了 src/main/resources/application.properties
、application.groovy
和 application.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
文件中设置maxFileSize
和maxRequestSize
限制。一定要有这样的东西:
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. maxFileSize
和 maxRequestSize
的正确值是多少?
这取决于应用程序类型,但将它们保持得太高通常是个坏主意。如果你真的需要上传大文件,或许你应该开发(或使用)一个专门的(和分离的)服务。
【讨论】:
这如何与 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限制的主要内容,如果未能解决你的问题,请参考以下文章