Максимальный размер файла для загрузки в Grails3
Я пытаюсь обновить ограничение на загрузку файла maxFileSize в Grails 3 и попробовал конфигурацию в 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?
5 ответов
Решение состоит в том, чтобы установить maxFileSize
а также maxRequestSize
пределы внутри вашего application.yml
файл. Не забудьте иметь что-то вроде этого:
grails:
controllers:
upload:
maxFileSize: 2000000
maxRequestSize: 2000000
замещать 2000000
с количеством макс. байтов, которое вы хотите для загрузки файла и для всего запроса. Grails 3 по умолчанию составляет 128000 (~128 КБ).
Часто задаваемые вопросы
1. Как перевести из МБ в байты?
YOUR_MAX_SIZE_IN_MB * 1024 * 1024 = BYTES
Например, конвертировать 5 МБ в байтах
5 * 1024 * 1024 = **5242880** bytes
2. Безопасность
Как цитата из OWASP
Ограничьте размер файла до максимального значения, чтобы предотвратить атаки типа "отказ в обслуживании".
Таким образом, эти ограничения существуют для предотвращения DoS-атак и обеспечения общей производительности приложений (больший размер запроса == больше памяти, используемой с сервера).
3. Какое значение для maxFileSize
а также maxRequestSize
?
Это зависит от типа приложения, но, как правило, плохая идея держать их слишком высокими. Если вам действительно нужно загружать большие файлы, возможно, вам следует разработать (или использовать) выделенный (и отдельный) сервис.
Частично проблема заключается в установке максимального размера файла. Другая проблема заключается в изящной обработке этой ошибки.
Вот мое определение бина:
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>());
}
}
}
Идея в том, чтобы проверить атрибут запроса в вашем контроллере или фильтре, чтобы определить, был ли файл слишком большим.
Мне также не повезло, пытаясь установить новые максимальные значения в application.properties или application.yml.
Что работает, хотя это использование определения bean-компонента в conf/spring/resources.groovy:
import javax.servlet.MultipartConfigElement
// Place your Spring DSL code here
beans = {
multipartResolver(org.springframework.web.multipart.commons.CommonsMultipartResolver){
maxInMemorySize=1000000
maxUploadSize=100000000
//uploadTempDir="/tmp"
}
}
https://github.com/grails/grails-core/issues/668
grails.controllers.upload.maxFileSize
и / или
grails.controllers.upload.maxRequestSize
конфиг свойства / настройки
Попробуйте это https://github.com/zyro23/grails-core-668/blob/master/grails-app/conf/application.yml
загрузить: maxFileSize: 9999999999 maxRequestSize: 9999999999
У меня работало следующее (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