содержание
Проблема
Столкнулся с неожиданной проблемой во время запроса файла на выгрузку обрезалось расширение файлов fileName.XLS или fileName.XLSX в результате в контроллер прилетало только fileName.
|
1 2 3 4 |
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET) public void getFile(@PathVariable("fileName") String fileName) { ... } |
рассмотрим следующие варианты :
Если ввести /files/leodev, «fileName» выведет leodev
Если ввести /files/leodev.ru, «fileName» выведет leodev, последняя точка(.) отсекается!?!?
Если ввести /files/leodev.ru.com, «fileName» выведет leodev.ru, последняя точка(.) отсекается!
Если ввести /files/leodev.ru.com.abc, «fileName» выведет leodev.ru.com
Если ввести /files/blog.leodev.ru, «fileName» выведет blog.leodev
Как видим последняя точка (.) всегда будет отсекаться
Решение
Что бы исправить это нужно добавить регулярное выражение к маппингу /files/{file_name:.+} в @RequestMapping
Согласно документации по умолчанию шаблон URI будет соответствовать регулярному выражению [^ \.] * (Т.е. любой символ, отличный от периода), но это можно изменить, указав другое регулярное выражение.
|
1 2 3 4 |
@RequestMapping(value = "/files/{file_name:.+}", method = RequestMethod.GET) public void getFile(@PathVariable("file_name") String fileName, HttpServletResponse response) { //... } |
Немного о Regular expression
Используя подсказки ниже разберем наше выражение:
. (точка) — говорит о том что после нашего file_name будет один любой символ
+(плюс) — после точки говорит что символ будет один или больше
========== МЕТАСИМВОЛЫ ============
^ (циркумфлекс) — начало проверяемой строки
$ (доллар) — конец проверяемой строки
. (точка) — любой символ
| — ИЛИ
? — предшествующий вопросу символ не обязательный
+ — любое колличество символов
* — любое кол-во экземпляров элемента(в том числе нулевое)
\\d — цифровой сивол
\\D — НЕ цифровой сивол
\\s — пробельный символ
\\S — НЕ пробельный символ
\\w — буквенный или цифровой символ или знак подчеркивания
\\W — любой символ кроме буквенного или цифрового или знака подчеркивания========== КВАНТИФИКАТОРЫ ============
+(плюс/знак конкатенации) — один или более символ