30 ноября 2021
Тэги: json, Kotlin, rest, Spring Boot, yaml, YouTube, файлы.
Предположим, перед нами стоит задача сделать в restful-сервисе, написанном на Kotlin и Spring Boot, эндпоинт для загрузки файлов с фронтэнда. Для пользователя такая загрузка выглядит как кнопка выбора файла с надписью «Обзор». Далее выбранный файл отправляется на бэк как поток бинарных данных. Этот поток имеет тип данных multipart/form-data.
Данный материал также доступен в формате видео на YouTube.
Для реализации эндпоинта в минимальном варианте в нашем проекте должна быть всего одна зависимость spring-boot-starter-web. Заготовку проекта на Kotlin можно сгенерить с помощью Spring Initializr.
Сам контроллер будет выглядеть примерно так:
Наш обработчик мапится на POST-запрос на эндпоинт /files. Сам файл, загружаемый с фронта, подставляется в параметр с именем file. Этот параметр имеет тип данных MultipartFile и снабжён аннотацией @RequestPart. Далее мы обращаемся к содержимому файла с помощью поля inputStream. Этот поток бинарных данных мы оборачиваем в буфер с помощью метода расширения bufferedReader(). Ну и для примера просто считываем весь файл построчно с помощью опять-таки метода расширения readLines() и отдаём полученные строки в качестве ответа уже в стандартном формате json.
Важно отметить, что буферизация входного потока здесь нужна для повышения производительности в случае загрузки больших файлов. Тогда даже файлы из миллионов строк будут обрабатываться за считанные секунды.
Чтобы протестировать эндпоинт и не прикручивать полноценный фронтэнд, используйте Postman. Для отправки любого файла на наш эндпоинт выберите тип запроса POST и укажите адрес http://127.0.0.1:8080/files. Затем перейдите на вкладку Body и там выберите переключатель form-data. После чего в поле Key введите file (имя параметра нашего метода на бэке), затем тип параметра в выпадающем списке выберите File, после чего в поле Value появится кнопка для выбора файла.
В конце нажмите кнопку Send для отправки запроса. Обратите внимание, что загружаемый файл должен быть текстовым, чтобы мы смогли его корректно прочитать.
Если выбрать текстовый файл, превышающий 10 Мб (стандартное ограничение Spring Boot), то можно получение ошибку о превышении лимита на размер файла. Тогда идём в папку resources нашего проекта, находим там файл application.properties и переименовываем его в application.yml, чтобы писать конфиг в yaml-формате. После чего добавим в него следующие параметры spring.servlet.multipart.max-file-size и spring.servlet.multipart.max-request-size:
Значения в мегабайтах выберите в зависимости от ваших потребностей. После этого проблем с загрузкой больших файлов быть не должно.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.