Ограничение maxFileSize загрузки файла 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?


person Naman Jain    schedule 24.04.2015    source источник


Ответы (6)


Grails 3 и 4

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

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

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



Вопросы-Ответы

<сильный>1. Как конвертировать из МБ в байты?

YOUR_MAX_SIZE_IN_MB * 1024 * 1024 = BYTES

Например. Конвертировать 5 МБ в байты

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

<сильный>2. Безопасность

Цитата из OWASP

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

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

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

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

person lifeisfoo    schedule 04.11.2015
comment
Как это работает с Grails 4? stackoverflow.com/questions/61892143/ - person Lastone; 19.05.2020

Часть проблемы заключается в установке максимального размера файла. Другая проблема заключается в корректной обработке этой ошибки.

Вот мое определение боба:

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>());
        }
    }
}

Идея состоит в том, чтобы проверить атрибут запроса в вашем контроллере или фильтре, чтобы определить, не слишком ли велик файл.

person James Kleeh    schedule 06.10.2015
comment
Когда я это сделал, файлы в пределах ограничений были потеряны. Вы знаете, что не так? - person ricardogobbo; 15.02.2018

Мне также не удалось установить новые максимальные значения в 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"
    }
}
person Michael B    schedule 24.04.2015
comment
Я пробовал это, для чего требовалась библиотека загрузки общих файлов в пути к классам «commons-fileupload: commons-fileupload: 1.2.1». Это все еще терпит неудачу с тем же исключением. Есть ли дополнительные настройки? - person Naman Jain; 27.04.2015
comment
Мне не нужны дополнительные настройки, и мне также не нужна зависимость от commons-fileupload. Что-то еще должно происходить в вашем приложении. - person Michael B; 29.04.2015
comment
Я добавил это: compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3' Кстати, только это, похоже, сработало. Он игнорировал другие настройки (Grails 3.2.11). - person Nathan Dunn; 26.08.2017
comment
Я использовал этот ответ в сочетании с комментарием о зависимостях. Ошибку устранил, но теперь файл в запросе нулевой. - person IgniteCoders; 11.04.2018
comment
Я также получаю пустой файл в запросе на Grails 3.3.10. - person Pablo Pazos; 27.06.2020

Попробуйте это https://github.com/zyro23/grails-core-668/blob/master/grails-app/conf/application.yml

загрузка: maxFileSize: 9999999999 maxRequestSize: 9999999999

person Ashutosh    schedule 06.10.2015
comment
См. мой ответ для полного объяснения. - person lifeisfoo; 21.04.2016

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

grails.controllers.upload.maxFileSize

и/или

grails.controllers.upload.maxRequestSize 

конфиг свойства/настройки

person Naman Jain    schedule 27.04.2015

у меня сработало следующее (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
person Yaron Lavi    schedule 12.06.2019
comment
Как вы обрабатываете исключение, когда файл больше максимального? - person Pablo Pazos; 27.06.2020