Максимальный размер файла для загрузки в 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
Другие вопросы по тегам