Рубрики
Без рубрики

Загрузка и извлечение файлов с помощью MongoDB и Spring Boot

Посмотрите, как загружать файлы разных размеров с помощью Spring Boot и MongoDB.

Автор оригинала: baeldung.

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

Title: Image:

Далее мы добавим фотографии.html просмотр для отображения ваших фотографий:



    

View Photo

Title: name sample

Аналогично, у нас есть uploadVideo.html для загрузки Видео :



Upload new Video

Title: Video:

И videos.html для отображения видео:



    

View Video

Title: title

8. Заключение

В этой статье мы узнали, как загружать и извлекать файлы с помощью MongoDB и Spring Boot. Мы использовали как SON , так и GridFS для загрузки и извлечения файлов.

Как всегда, полный исходный код доступен в проекте GitHub .