MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Качвайте и извличайте файлове с помощта на MongoDB и Spring Boot

1. Прегледа

В този урок ще обсъдим как да качваме и извличаме файлове с помощта на MongoDB и Spring Boot.

Ще използваме MongoDB BSON за малки файлове и GridFS за по-големите.

2. Конфигурация на Mavenа

Първо, ще добавим spring-boot-starter-data-mongodb зависимост от нашия pom.xml :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Освен това ще ни трябва spring-boot-starter-web и spring-boot-starter-thymeleaf зависимости за показване на потребителския интерфейс на нашето приложение. Тези зависимости са показани и в нашето Ръководство за Spring Boot с 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

Също така ще зададем свойствата на Servlet Multipart, за да позволяваме качване на големи файлове:

spring.servlet.multipart.max-file-size=256MB
spring.servlet.multipart.max-request-size=256MB
spring.servlet.multipart.enabled=true

4. Качване на малки файлове

Сега ще обсъдим как да качваме и извличаме малки файлове (размер <16MB) с помощта на MongoDB BSON .

Тук имаме прост Документ клас — Снимка. Ще съхраняваме нашия файл с изображение в BSON Двоичен :

@Document(collection = "photos")
public class Photo {
    @Id
    private String id;
    
    private String title;
        
    private Binary image;
}

И ще имаме просто PhotoRepository :

public interface PhotoRepository extends MongoRepository<Photo, String> { }

Сега за PhotoService , ще имаме само два метода:

  • добави снимка() — за да качите Снимка към 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. Качване на големи файлове

Сега ще използваме GridFS за качване и извличане на големи файлове.

Първо, ще дефинираме прост DTO – Видео – за представяне на голям файл:

public class Video {
    private String title;
    private InputStream stream;
}

Подобно на PhotoService , ще имаме VideoService с два метода — 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. Контролери

Сега, нека да разгледаме контролерите — PhotoController и VideoController .

6.1. PhotoController

Първо, имаме PhotoController, които ще използват нашата PhotoService за добавяне/получаване на снимки .

Ще дефинираме 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;
}

Имаме и getPhoto() за да извлечете снимка с даден идентификатор:

@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. Видеоконтролер

След това нека да разгледаме нашия VideoController .

Това ще има подобен метод, 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;
}

И тук имаме getVideo() за да извлечете Видео с даден идентификатор :

@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";
}

Можем също да добавим streamVideo() метод, който ще създаде URL за поточно предаване от Видео 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 , който предоставя лесна форма за качване на изображение:

<html>
<body>
<h1>Upload new Photo</h1>
<form method="POST" action="/photos/add" enctype="multipart/form-data">
    Title:<input type="text" name="title" />
    Image:<input type="file" name="image" accept="image/*" />
    <input type="submit" value="Upload" />
</form>
</body>
</html>

След това ще добавим photos.html преглед за показване на нашите снимки:

<html>
<body>
    <h1>View Photo</h1>
    Title: <span th:text="${title}">name</span>
    <img alt="sample" th:src="*{'data:image/png;base64,'+image}" />
</body>
</html>

По същия начин имаме uploadVideo.html за да качите Видеоклип :

<html>
<body>
<h1>Upload new Video</h1>
<form method="POST" action="/videos/add" enctype="multipart/form-data">
    Title:<input type="text" name="title" />
    Video:<input type="file" name="file" accept="video/*" />
    <input type="submit" value="Upload" />
</form>
</body>
</html>

И videos.html за показване на видеоклипове:

<html>
<body>
    <h1>View Video</h1>
    Title: <span th:text="${title}">title</span>
    <video width="400" controls>
        <source th:src="${url}" />
    </video>
</body>
</html>

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. как да групирате в mongoDB и да върнете всички полета в резултат

  2. Персонализираният домейн Heroku не работи

  3. Как мога да преименувам поле за всички документи в MongoDB?

  4. Групирайте и пребройте с условие

  5. Как да преименувам полета при извършване на търсене/проекция в MongoDB?