【发布时间】:2019-11-02 00:33:16
【问题描述】:
我正在尝试创建一个电影数据库网络应用程序。每部电影都应该有一张海报图片。我不知道如何使用 Spring Data REST 正确地将图像提供给前端。
Movie.java
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.File;
import java.sql.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@Data
@Entity
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String director;
private Date releaseDate;
private File posterFile;
@ManyToMany
@JoinTable(
name = "MOVIE_GENRES",
joinColumns = @JoinColumn(name = "MOVIE_ID"),
inverseJoinColumns = @JoinColumn(name = "GENRE_ID"))
private Set<Genre> genres = new HashSet<>();
@OneToMany
@MapKeyColumn(name = "ACTOR_ROLE")
private Map<String, Actor> cast = new HashMap<>();
public Movie(String title) {
this.title = title;
}
public void addActor(String role, Actor actor) {
cast.put(role, actor);
}
public void removeActor(String role) {
cast.remove(role);
}
public void addGenre(Genre genre) {
genres.add(genre);
}
public void removeGenre(Genre genre) {
genres.remove(genre);
}
}
我不能在电影 bean 中使用字节数组,因为它太大而无法保存在数据库中。我可以存储文件对象或路径对象或包含路径的字符串:
private File posterFile;
问题是,它将保存像"C:\user\documents\project\backend\images\posterxyz.png" 这样的本地路径。
当我尝试在前端将此路径用作 img-src 时,出现错误“不允许加载本地资源”。我的意思是,无论如何,这听起来像是一种愚蠢的做法。我只是不知道这样做的正确方法是什么。
这是电影资料库。 我在后端使用 Spring Data REST 生成超媒体应用语言格式的 JSON。
MovieRepository.java
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(collectionResourceRel = "movies", path = "movies")
public interface MovieRepository extends PagingAndSortingRepository<Movie, Long> {
}
【问题讨论】:
-
您能解释一下您找到的解决方案吗?您将下面的答案标记为已接受,但它没有解决原始问题,即如何序列化文件?如果将文件对象放入实体中,究竟会发生什么? spring data rest是否只是将文件保存到数据库中?
-
图像不存储在数据库中,它们位于静态文件夹中,例如:
src/main/resources/static/lord-of-the-rings.jpg我实际上从未真正持久化任何东西,我在应用程序启动时使用 CommandLineRunner 类创建了 Spring 实体并使用内存数据库。所以我不确定 Spring 在调用存储库的保存函数后对文件对象做了什么。
标签: image file vue.js spring-data-jpa spring-data-rest