Content-Type не разрешен при загрузке файла SVG, который находится в разрешенном белом списке

ВАЖНО! В Struts версии 2.3.24 устранена следующая проблема.

Начиная с этой версии нет необходимости экранировать какой-либо символ.

Подробнее: JIRA Issue WW-4457.


Я настроил перехватчик Struts2 FileUpload, чтобы разрешить белый список типов содержимого.

Это корректно работает с любым файлом, соответствующим указанному Content-Type, но не работает с SVG файлами, которые имеет тип носителя MIME image/svg+xml.

Используя эту конфигурацию:

@Action(value = "upload", 
    interceptorRefs = @InterceptorRef( 
        value = "defaultStack",
        params = { "fileUpload.allowedTypes" , "application/pdf,"
                                             + "image/jpeg,"
                                             + "image/gif,"
                                             + "image/png,"
                                             + "image/svg+xml"
                  }))

и загружая действительный файл SVG, я получаю сообщение об ошибке, определяемое свойством struts.messages.error.content.type.not.allowed:

Тип контента не разрешен: {0} {1} {2} {3}

где {3} — это Content-Type, который пользователь пытается загрузить;

Тогда, например:

Content-Type не разрешен: myFile Sample.svg upload__123__456__78.tmp image/svg+xml

Это точно тот же Content-Type, который я определил в allowedTypes белом списке.

Обратите внимание, что я использую regex Pattern Matcher, включенный со следующей константой в struts.xml:

<constant name="struts.patternMatcher"  value="regex" />

Почему не работает и как заставить работать?


person Andrea Ligios    schedule 03.02.2015    source источник
comment
Вы изменили сопоставление шаблонов по умолчанию? Возможно, для regex?   -  person Aleksandr M    schedule 04.02.2015
comment
Определенно ! Добавление к вопросу сейчас, спасибо   -  person Andrea Ligios    schedule 04.02.2015
comment
@AleksandrM не стесняйтесь отвечать с дополнительными подробностями о сопоставлении с образцом, и я проголосую за   -  person Andrea Ligios    schedule 04.02.2015


Ответы (2)


Перехватчик fileUpload использует PatternMatcher для проверки допустимых типов mime. По умолчанию S2 использует сопоставитель шаблонов WildcardHelper, который будет работать с image/svg+xml.

При изменении сопоставления шаблонов по умолчанию на regex перехватчик fileUpload начинает проверять разрешенные типы с помощью регулярных выражений. А + — это специальный символ в регулярном выражении, поэтому его нужно экранировать таким образом image/svg\\+xml, чтобы работать.

Примечание. Изменение сопоставления шаблонов по умолчанию в этом случае приводит к неожиданному поведению и, возможно, о нем следует сообщать как об ошибке.

person Aleksandr M    schedule 04.02.2015
comment
Принял ваш ответ из-за анализа, которого нет в моем. Вы сообщите об этом как об ошибке? - person Andrea Ligios; 04.02.2015
comment
@AleksandrM проблема решена :) Спасибо за сообщение :) - person Lukasz Lenart; 08.03.2015
comment
@AndreaLigios: Можете ли вы протестировать снимок 2.3.22, чтобы убедиться, что он работает для вас — WW-4457. - person Aleksandr M; 12.03.2015
comment
Ожидание релизной версии для финального теста - person Andrea Ligios; 16.03.2015
comment
@AndreaLigios: 2.3.24 отсутствует. - person Aleksandr M; 12.05.2015
comment
@AndreaLigios: Его еще нет на главной странице, но скоро будет. search.maven.org/ - person Aleksandr M; 12.05.2015

Виновником является символ + в MIME.

Он каким-то образом зарезервирован, и, следовательно, его нужно экранировать; так как с плагином Convention он находится внутри строки, экранирующая обратная косая черта также должна быть экранирована.

Использование image/svg\\+xml прекрасно работает:

params = { "fileUpload.allowedTypes" ,    "application/pdf,"
                                        + "image/jpeg,"
                                        + "image/gif,"
                                        + "image/png,"
                                        + "image/svg\\+xml"

Я не уверен, что это необходимо и для стандартной конфигурации на основе XML.

person Andrea Ligios    schedule 03.02.2015