Максимальное количество загрузок файла Grails3 maxFileSize

Я пытаюсь обновить ограничение 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?

Ответ 1

Решение состоит в том, чтобы установить maxFileSize и maxRequestSize пределы внутри вашего файла application.yml. Убедитесь, что у вас есть что-то вроде этого:

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

Замените 2000000 на количество максимальных байтов, которое требуется для загрузки файла и для всего запроса. Значение по умолчанию Grails 3 составляет 128000 (~ 128 КБ).



FAQ

1. Как конвертировать из MB в байты?

YOUR_MAX_SIZE_IN_MB * 1024 * 1024 = BYTES

например. Преобразование 5 МБ в байтах

5 * 1024 * 1024 = **5242880** bytes

2. Безопасность

Как цитата из OWASP

Ограничьте размер файла до максимального значения, чтобы предотвратить атак типа "отказ в обслуживании"

Таким образом, эти ограничения существуют для предотвращения DoS-атак и обеспечения общей производительности приложений (больший размер запроса == больше памяти, используемой на сервере).

3. Какое правильное значение для maxFileSize и maxRequestSize?

Это зависит от типа приложения, но, как правило, это плохая идея держать их слишком высокими. Если вам действительно нужно загружать большие файлы, возможно, вам следует разработать (или использовать) выделенный (и выделенный) сервис.

Ответ 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.

Что работает, хотя использует определение 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"
    }
}

Ответ 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