Я бы посоветовал вам взглянуть на Spring Content .Этот проект сообщества позволяет связать контент (то есть неструктурированные данные, такие как видео) с объектами Spring Data Entities, используя ту же модель программирования.
Это довольно просто добавить в существующий проект, и оно даст вам такое же простое программирование.модель как Spring Data, абстракция над вашим хранилищем (чтобы его можно было хранить в любой поддержке Storage Spring Content) и множество других функций OOTB, таких как конечная точка REST, которые поддерживают потоковое видео.
На случай, если вы заинтересованывот как я думаю, вы могли бы это сделать (при условии Spring Boot).
Добавить зависимости в ваш проект: -
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs-boot-starter</artifactId>
<version>0.5.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest-boot-starter</artifactId>
<version>0.5.0</version>
</dependency>
Настройка хранилища файлов:
StoreConfig.java
@Configuration
@EnableFilesystemStores
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File(JeutrollServiceImp.uploadDirectory);
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
Связывание содержимого с вашей сущностью:
@Entity
public class Video {
@Id @GeneratedValue
private Long id;
... other Spring Data fields ...
// associate the video
@ContentId
private UUID contentId;
@ContentLength
private Long contentLength;
@Mimetype
private String mimeType;
// associate thumbnails
private Thumbnail thumbnail;
...
}
@Entity
public class Thumbnail {
@ContentId
private UUID contentId;
@ContentLength
private Long contentLength;
@MimeType
private String mimeType;
}
Создание видеоstore и магазин миниатюр:
VideoStore.java / ThumbnailStore.java
@StoreRestResource(path="videoContent")
public interface VideoStore extends ContentStore<Video,UUID> {
}
public interface ThumbnailStore extends ContentStore<Thumbnail,UUID> {
}
Зависимость spring-content-fs-boot-starter
приведет к внедрению Spring ContentРеализации на основе ilesystem, поэтому вам не нужно беспокоиться об их реализации.Более того, зависимость spring-content-rest
заставит Spring Content также внедрить реализации @Controller
, которые перенаправляют HTTP-запросы на методы VideoStore
и ThumbnailStore
соответственно.
Таким образом, теперь у вас будет полнофункциональный (POST, PUT, GET, DELETE) видеосервис на основе REST на /videoContent
, который будет использовать VideoStore
для извлечения (и сохранения) видео в JeutrollServiceImp.uploadDirectory
на вашем сервере.
Итак:
POST /videoContent/ -F "image=@/some/path/to/a/video.mp4"
загрузит video.mp4
и добавит его в каталог загрузок.
GET /videoContent/{videoId}
получит его снова и сохранит остальные конечные точки, поддерживая запросы Range, чтобы элементы управления видео HTML5 работали надлежащим образом.
Для миниатюр можно добавить обработку для генерации и сохранения миниатюры в обработчике событий аннотированного хранилища: -
@Configuration
public class ThumbnailConfig {
@Bean
public StoreEventHandler thumbnailEventHandler() {
return new ThumbnailEventHandler();
}
@StoreEventHandler
public static class ThumbnailEventHandler {
@Autowired
VideoRepository videoRepository;
@Autowired
VideoStore videoStore;
@Autowired
ThumbnailStore thumnailStore;
@HandleAfterSetContent
public void handleAfterSetContent(Video video) {
BufferedImage img = // use modfied retrieveThumbnailFromVideo(videoStore.getContent(video));
Thumbnail thumbnail = new Thumbnail();
thumbnail.setMimeType("png")
thumbnail.setContent(thumbnail, toInputStream(img))
video.setThumbnail(thumbnail)
videoRepository.save(video);
}
}
}
После сохранения каждого видео его миниатюра будет доступна через:
GET /videoContent/{videoId}/thumbnail
или:
GET /videoContent/{videoId}/thumbnail/{contentId}
Когда мы сохраняем mimetype, эти URL будут использоваться как src
в стандарте вашего HTML.
Итак:
Становится:
HTH