Вы можете использовать Spring Content , способный связывать контент с объектами данных Spring и предоставлять REST API для управления этим контентом.
Добавьте следующие зависимости в POM (Spring Boot)Также доступны стартеры):
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>0.4.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.4.0</version>
</dependency>
Настройка хранилища файлов:
StoreConfig.java
@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/files");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
Свяжите контент с вашей сущностью Produit:
@Entity
public class Produit implements Serializable{
@Id @GeneratedValue
private Long id;
private String designation;
@OneToMany(mappedBy = "produit", cascade = CascadeType.REMOVE)
private List<Image> images;
...
}
@ Открытый класс объекта Entity Image {@ContentId private UUID contentId;@ContentLength private Long contentLength;@MimeType private String mimeType;}
Создать хранилище контента (очень похожее на интерфейс репозитория):
ImageStore.java
@StoreRestResource(path="produitImages")
public interface ImageStore extends ContentStore<Image,UUID> {
}
И это все.ImageStore по сути является универсальным Spring ResourceLoader.Зависимость spring-content-fs
заставит Spring Content внедрить реализацию на основе файловой системы, поэтому вам не нужно беспокоиться о ее реализации самостоятельно.Более того, зависимость spring-content-rest
заставит Spring Content также внедрить реализацию, если @Controller
, который перенаправляет HTTP-запросы в метод ImageStore
.
Таким образом, теперь у вас будет полностью функциональная (POST, PUT, GET, DELETE) файловая служба на основе REST на /produitImages
, которая будет использовать ваш ImageStore
для извлечения (и сохранения) файлов в /path/to/your/files
на вашем сервере.
Итак:
POST /produitImages/{produitId}/some/image.jpg -F "image=@/home/user1/Desktop/test1.jpg"
загрузит test1.jpg
и добавит его в список produitId1
изображений.
GET /produitImages/{produitId}
вернет список изображений.
GET /produitImages/{produitId}/images/{contentId}
вернет конкретное изображение.
HTH