Почему бы вам не взглянуть на проект сообщества Spring Content .Этот проект позволяет связать контент с сущностями Spring Data.Думайте Spring Data, но для Контента или неструктурированных данных.Это также может дать вам конечные точки REST для контента, например Spring Data REST.
Этот подход предоставит вам четкую абстракцию для вашего контента с реализациями для различных типов хранилищ.Он основан на потоке, а не на байтах.Использование byte [] не сработает, если вы хотите передавать очень большие файлы.Кроме того, получение баз данных для правильной потоковой передачи является очень своеобразным.Вы, вероятно, не хотите разбираться со всем этим самим, когда Spring Content уже имеет.
Это довольно легко добавить в ваши существующие проекты.Я не уверен, используете ли вы Spring Boot или нет.Я приведу пример загрузки без пружины:
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-jpa</artifactId>
<version>0.5.0</version>
</dependency>
<!-- REST API (if you want it) -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.5.0</version>
</dependency>
Конфигурация
@Configuration
@EnableJpaStores
@Import("org.springframework.content.rest.config.RestConfiguration.class")
public class ContentConfig {
// schema management
//
@Value("/org/springframework/content/jpa/schema-drop-mysql.sql")
private Resource dropContentTables;
@Value("/org/springframework/content/jpa/schema-mysql.sql")
private Resource createContentTables;
@Bean
DataSourceInitializer datasourceInitializer() {
ResourceDatabasePopulator databasePopulator =
new ResourceDatabasePopulator();
databasePopulator.addScript(dropContentTables);
databasePopulator.addScript(createContentTables);
databasePopulator.setIgnoreFailedDrops(true);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource());
initializer.setDatabasePopulator(databasePopulator);
return initializer;
}
}
Чтобы связать контент, добавьте аннотации Spring Content к своей учетной записи.
ArriveEntity.java
@Entity
public class ArriveEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
.. existing fields...
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
// if you have rest endpoints
@MimeType
private String mimeType = "text/plain";
}
Создайте "хранилище":
ArrivEntityContentStore.java
@StoreRestResource(path="arriveEntityContent)
public interface ArrivEntityContentStore extends ContentStore<ArriveEntity, String> {
}
Это все, что вам нужно для создания конечных точек REST @ /arriveEntityContent
.Когда ваше приложение запускается, Spring Content проверит ваши зависимости (см. Spring Content JPA / REST), взглянет на ваш ArrivEntityContentStore
интерфейс и внедрит реализацию этого интерфейса для JPA.Он также внедрит @Controller
, который перенаправляет http-запросы в эту реализацию.Это избавляет вас от необходимости реализовывать все это самостоятельно, что, я думаю, то, что вы ищете.
Итак ...
Чтобы получить доступ к контенту с помощью API Java, автоматически подключите ArrivEntityContentStore
и используйте его методы.
Или для доступа к контенту с помощью REST API:
curl -X POST /arriveEntityContent/{arriveEntityId}
с запросом multipart / form-data сохранит изображение в базе данных и свяжет его с объектом учетной записи, чей идентификатор равен itemId
.
curl /arriveEntityContent/{arriveEntityId}
получит его снова и так далее ... поддерживает полный CRUD.
Есть несколько руководств по началу работы здесь .Справочное руководство - здесь .И здесь есть обучающее видео здесь .Кодовый бит начинается примерно на полпути.
HTH