spring - 如何在 Spring Data Rest 中为实体保存文件?
问题描述
在 SDR 的常规实体中,它会处理实体的所有属性,以便您将其保存到数据库中。但是你如何处理文件?
@Entity
public class User {
String name;
Set<File> myfiles; //how can I make this work?
}
@RepositoryRestResource
public interface UserRepository extends JpaRepository<User, Long> {}
如何使用户拥有文件列表,可以上传和下载它们?
解决方案
这对于 Spring Data/REST 来说是不可能的,因为它专注于结构化数据;即表格和关联,在大多数情况下。
@Lob
是有问题的,因为它迫使您将内容存储在数据库中,而数据库不一定是您想要存储它的位置。例如,文件系统或 S3 可能会更好。
byte[]
如果你有非常大的文件也会有问题,因为你可能会导致 OutOfMemoryExceptions。
取而代之的是一个名为Spring Content的社区项目,它可以准确解决您要解决的问题。
Spring Content 为非结构化数据提供与 Spring Data/REST 相同的编程范式;即图像、文档、电影等。因此,使用这个项目,您可以将一个,或者在您的情况下,许多“内容”对象与您的 Spring Data 实体相关联,并通过 HTTP 管理它们,就像您对 Spring Data 实体所做的一样。
添加到您的项目中非常简单,如下所示:
pom.xml(也可以使用引导启动器)
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>1.0.0.M4</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>1.0.0.M4</version>
</dependency>
配置
@Configuration
@EnableFilesystemStores
@Import("org.springframework.content.rest.config.RestConfiguration.class")
public class ContentConfig {
@Bean
FileSystemResourceLoader fileSystemResourceLoader() throws IOException {
return new FileSystemResourceLoader(new File("/path/to/uploaded/files").getAbsolutePath());
}
}
要关联内容,请按如下方式修改您的用户实体:
@Entity
public class User {
String name;
List<Image> images;
}
添加一个图像实体:
@Entity
public class Image {
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType = "text/plain";
}
并为此添加一个“存储”(相当于存储库,但用于内容):
ImageStore.java
@StoreRestResource
public interface ImageStore extends FilesystemContentStore<Image, String> {}
这就是创建 REST 端点 @ 所需的全部内容/users/{userId}/images
。当您的应用程序启动时,Spring Content 将查看您的依赖项,查看 Spring Content Filesystem,查看您的ImageStore
接口并注入该接口的基于文件系统的实现。它还将查看 Spring Content REST 依赖项并注入一个@Controller
实现,将 HTTP 请求转发到您的ImageStore
. 就像 Spring Data 为您的UserRepository
. 这使您不必自己实施任何这些,我认为这就是您所追求的。
所以...
使用注入的 REST API 管理内容:
curl -X POST /users/{userId}/images
-F 文件=@/path/to/image.jpg
将图像存储在文件系统中的 ``并将其与 id 为userId
.
curl /users/{userId}/images/{contentId} -H "Accept: image/jpeg"
将再次获取它等等...支持所有 CRUD 方法和视频流以及顺便说一句!
这里有一些入门指南。Spring Content Filesystem 的参考指南在这里。这里有一个教程视频。编码位从大约 1/2 处开始。
还有几点: - 如果您使用 Spring Boot Starters,那么大部分情况下您不需要 @Configuration。
- 就像 Spring Data 是一种抽象一样,Spring Content 也是如此,因此您不仅限于将图像存储在文件系统上。您可以将它们作为 BLOB 存储在数据库中,或者存储在像 S3 这样的云存储中。
高温高压
推荐阅读
- ios - 如何在 iOS 中使用 XCode 9 自定义导航栏
- ruby-on-rails - 登录后如何对“current_user_sign_in_ip”进行地理编码
- javascript - 如何定位 iframe 中没有 Id 或 Class 属性的元素?
- apache-nifi - Apache Nifi - 将顶级元素移动到子元素中(JSON/XML)
- python-3.x - Selenium Webdriver 保存损坏的 jpeg
- api - 使用我们自己的解决方案保护现有 API
- r - 从地图中删除国家和城市名称
- node.js - AWS Lambda 无法正确发布到 IoT 主题
- angular - Angular 6 - 模拟 authState - 未定义的 valueChanges
- php - 如何使用 Codeigniter/PHP 在运行时动态调整图像大小?