1. Обзор
В этом уроке мы обсудим, как загружать и извлекать файлы с помощью MongoDB и Spring Boot.
Мы будем использовать MongoDB BSON для небольших файлов и сетки для более крупных.
2. Конфигурация Maven
Во-первых, мы добавим зависимость spring-boot-starter-data-mongodb в ваш pom.xml :
org.springframework.boot spring-boot-starter-data-mongodb
Кроме того, нам понадобятся зависимости spring-boot-starter-web и spring-boot-starter-thymeleaf для отображения пользовательского интерфейса нашего приложения. Эти зависимости также показаны в нашем Руководстве по весенней загрузке с Thymeleaf .
В этом уроке мы используем Spring Boot версии 2.x.
3. Свойства пружинной Загрузки
Далее мы настроим необходимые свойства Spring Boot.
Давайте начнем с свойств MongoDB :
spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=springboot-mongo
Мы также установим составные свойства сервлета, чтобы разрешить загрузку больших файлов:
spring.servlet.multipart.max-file-size=256MB spring.servlet.multipart.max-request-size=256MB spring.servlet.multipart.enabled=true
4. Загрузка Небольших Файлов
Теперь мы обсудим, как загружать и извлекать небольшие файлы (размер < 16 МБ) с помощью MongoDB BSON .
Здесь у нас есть простой Документ класс — Фотография. Мы будем хранить наш файл изображения в BSON | Двоичном файле :
@Document(collection = "photos") public class Photo { @Id private String id; private String title; private Binary image; }
И у нас будет простое Хранилище фотографий :
public interface PhotoRepository extends MongoRepository{ }
Теперь для Фотослужбы у нас будет только два метода:
- addPhoto() — для загрузки Фото в MongoDB
- getPhoto() — для получения Фотографии с заданным идентификатором
@Service public class PhotoService { @Autowired private PhotoRepository photoRepo; public String addPhoto(String title, MultipartFile file) throws IOException { Photo photo = new Photo(title); photo.setImage( new Binary(BsonBinarySubType.BINARY, file.getBytes())); photo = photoRepo.insert(photo); return photo.getId(); } public Photo getPhoto(String id) { return photoRepo.findById(id).get(); } }
5. Загрузка Больших Файлов
Теперь мы будем использовать сетки для загрузки и извлечения больших файлов.
Во – первых, мы определим простой DTO – Video – для представления большого файла:
public class Video { private String title; private InputStream stream; }
Аналогично Фотослужбе , у нас будет Видеосервис с двумя методами — addVideo() и getVideo() :
@Service public class VideoService { @Autowired private GridFsTemplate gridFsTemplate; @Autowired private GridFsOperations operations; public String addVideo(String title, MultipartFile file) throws IOException { DBObject metaData = new BasicDBObject(); metaData.put("type", "video"); metaData.put("title", title); ObjectId id = gridFsTemplate.store( file.getInputStream(), file.getName(), file.getContentType(), metaData); return id.toString(); } public Video getVideo(String id) throws IllegalStateException, IOException { GridFSFile file = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id))); Video video = new Video(); video.setTitle(file.getMetadata().get("title").toString()); video.setStream(operations.getResource(file).getInputStream()); return video; } }
Для получения более подробной информации об использовании GridFS с Spring ознакомьтесь с нашей статьей GridFS в Spring Data MongoDB .
6. Контроллеры
Теперь давайте взглянем на контроллеры — Фотоконтроллер и ВидеоКонтроллер .
6.1. Фотоконтроллер
Во-первых, у нас есть фотоконтроллер, который будет использовать наш фотосервис для добавления/получения фотографий .
Мы определим метод addPhoto() для загрузки и создания новой Фотографии :
@PostMapping("/photos/add") public String addPhoto(@RequestParam("title") String title, @RequestParam("image") MultipartFile image, Model model) throws IOException { String id = photoService.addPhoto(title, image); return "redirect:/photos/" + id; }
У нас также есть get Photo() для получения фотографии с заданным идентификатором:
@GetMapping("/photos/{id}") public String getPhoto(@PathVariable String id, Model model) { Photo photo = photoService.getPhoto(id); model.addAttribute("title", photo.getTitle()); model.addAttribute("image", Base64.getEncoder().encodeToString(photo.getImage().getData())); return "photos"; }
Обратите внимание, что, поскольку у нас есть данные изображения, возвращенные в виде байт[] , мы преобразуем его в Base64 Строка чтобы отобразить его на интерфейсе.
6.2 Видеоконтроллер
Далее давайте взглянем на наш видеоконтроллер .
Это будет иметь аналогичный метод, addVideo() , для загрузки Видео в наш MongoDB:
@PostMapping("/videos/add") public String addVideo(@RequestParam("title") String title, @RequestParam("file") MultipartFile file, Model model) throws IOException { String id = videoService.addVideo(title, file); return "redirect:/videos/" + id; }
И здесь у нас есть get Video() для получения Видео с заданным идентификатором :
@GetMapping("/videos/{id}") public String getVideo(@PathVariable String id, Model model) throws Exception { Video video = videoService.getVideo(id); model.addAttribute("title", video.getTitle()); model.addAttribute("url", "/videos/stream/" + id); return "videos"; }
Мы также можем добавить метод stream Video () , который создаст потоковый URL-адрес из Video /InputStream :
@GetMapping("/videos/stream/{id}") public void streamVideo(@PathVariable String id, HttpServletResponse response) throws Exception { Video video = videoService.getVideo(id); FileCopyUtils.copy(video.getStream(), response.getOutputStream()); }
7. Интерфейс
Наконец, давайте посмотрим на наш интерфейс.
Давайте начнем с uploadPhoto.html
, который предоставляет простую форму для загрузки изображения:
Upload new Photo
Далее мы добавим фотографии.html просмотр для отображения ваших фотографий:
View Photo
Title: name
Аналогично, у нас есть uploadVideo.html для загрузки Видео :
Upload new Video
И videos.html для отображения видео:
View Video
Title: title
8. Заключение
В этой статье мы узнали, как загружать и извлекать файлы с помощью MongoDB и Spring Boot. Мы использовали как SON , так и GridFS для загрузки и извлечения файлов.
Как всегда, полный исходный код доступен в проекте GitHub .