Вам следует взглянуть на проект сообщества Spring под названием Spring Content .
Этот проект позволяет легко создавать содержательные приложения и сервисы. Он имеет ту же модель программирования, что и Spring Data. Это означает, что он может предоставлять реализации для хранилища файлов и контроллеров REST поверх этого хранилища файлов, поэтому вам не нужно заботиться о создании их самостоятельно. Spring Content - это данные (или неструктурированные данные), а Spring Data - структурированные данные
Это может выглядеть примерно так: -
pom. xml (для Spring Web MVC. Spring Boot также поддерживается)
<!-- Spring Web MVC dependencies -->
...
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>1.0.0.M5</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>1.0.0.M5</version>
</dependency>
StoreConfig. java
@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/uploaded/files");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
ImageStore. java
@StoreRestResource(path="images")
public interface ImageStore extends Store<String> {
}
Это все, что вам нужно сделать, чтобы получить конечные точки REST, которые позволят вам хранить и извлекать файлы. Как уже упоминалось, как это на самом деле работает, очень похоже на Spring Data. Когда ваше приложение запустится, Spring Content увидит зависимость spring-content-fs
, знайте, что вы хотите сохранить контент в вашей файловой системе, и внедрите реализацию интерфейса ImageStore
в файловой системе в контекст приложения. Он также увидит spring-content-rest
и введет контроллер (т. Е. Конечные точки REST), который взаимодействует с интерфейсом ImageStore
. Следовательно, вам не нужно ничего делать самостоятельно.
Так, например:
curl -X POST /images/myimage.jpg -F "file=@/path/to/myimage.jpg"
сохранит изображение в файловой системе в /path/to/your/uploaded/files/myimage.jpg
И:
curl /images/myimage.jpg
получит его снова и так далее ... эти конечные точки поддерживают полный CRUD, а конечные точки GET & PUT также поддерживают потоковую передачу видео (или запросы диапазона байтов).
You также может решить сохранить содержимое в другом месте, например, в базе данных с вашими сущностями или в S3, поменяв местами зависимость spring-content-fs
для соответствующего модуля Spring Content Storage. Примеры для каждого типа хранилища: здесь .
Кроме того, если это полезно, часто контент связан с объектами данных Spring. Таким образом, интерфейс ImageStore также может реализовывать ContentStore, например:
> FileStore.java
@StoreRestResource(path="images")
public interface ImageStore extends ContentStore<PersonalInfo, String> {
}
, и добавлять поля, аннотированные Spring Content, в ваши объекты Spring Data, например:
> PersonalInfo.java
@Entity
public class PersonalInfo {
@Id
@GeneratedValue
private long id;
...other existing fields...
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType = "text/plain";
...
}
При таком подходе конечные точки REST изменяются, так как контент теперь адресуется через URL-адрес данных Spring. Итак:
POST /personalInfos/{personalInfoId} -F "image=@/some/path/to/myimage.jpg"
загрузит myimage.jpg
в /path/to/your/uploaded/files/myimage.jpg
. Как и раньше, но он также обновит поля в сущности PersonalInfo с идентификатором personalInfoId
.
GET /personalInfos/{personalInfoId}
получит его снова.
HTH