【发布时间】:2022-01-07 07:02:36
【问题描述】:
我正在尝试使用 Spring boot 在 MySQL 中存储图像,我有一个用户实体,我想在我的 FileUpload 实体之间创建多对一关系。
我在前端使用 react,此上传服务的目的是让用户可以设置自己的个人资料图片,但我首先希望正确地获取 User 和 FileUpload 实体之间的关系。
我遇到的问题是,当用户上传图像时,FileUpload 表中的 joinColumn 没有保存用户实体 ID。它只是在外键字段中返回一个空值。
文件上传.java
@Entity
@Table(name="file_upload")
public class FileUpload {
@Id
@GenericGenerator(name = "uuid", strategy = "uuid2")
@GeneratedValue(generator = "uuid")
private String id;
private String name;
private String type;
@Lob
private byte[] data;
@ManyToOne
@JoinColumn( name="user_id")
private User user;
public FileUpload() {
}
public FileUpload(String name, String type, byte[] data) {
this.name = name;
this.type = type;
this.data = data;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
FileUploadService.java
- 我也有一个存储库,里面没有自定义方法。
@Service
public class FileUploadService {
@Autowired
private FileUploadRepository fileUploadRepository;
public FileUpload store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
FileUpload fileDB = new FileUpload(fileName, file.getContentType(), file.getBytes());
return fileUploadRepository.save(fileDB);
}
public FileUpload getFile(String id) {
return fileUploadRepository.findById(id).get();
}
public Stream<FileUpload> getAllFiles() {
return fileUploadRepository.findAll().stream();
}
}
FileUploadController.java
@Controller
@CrossOrigin()
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
@PostMapping("/upload")
public ResponseEntity<?> uploadFile(@RequestParam("file")MultipartFile file) {
String message = "";
try {
fileUploadService.store(file);
message = "Uploaded the file successfully: " + file.getOriginalFilename();
return ResponseEntity.status(HttpStatus.OK).body(new ApiResponse(true, message));
} catch (Exception e) {
message = "Could not upload the file: " + file.getOriginalFilename() + "!";
return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ApiResponse(true, message));
}
}
@GetMapping("/files")
public ResponseEntity<List<?>> getListFiles() {
List<FileUploadResponse> files = fileUploadService.getAllFiles().map(dbFile -> {
String fileDownloadUri = ServletUriComponentsBuilder
.fromCurrentContextPath()
.path("/files/")
.path(dbFile.getId())
.toUriString();
return new FileUploadResponse(
dbFile.getName(),
fileDownloadUri,
dbFile.getType(),
dbFile.getData().length);
}).collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK).body(files);
}
@GetMapping("/files/{id}")
public ResponseEntity<byte[]> getFile(@PathVariable String id) {
FileUpload fileUpload = fileUploadService.getFile(id);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileUpload.getName() + "\"")
.body(fileUpload.getData());
}
}
我与一个确认令牌实体有相同的关系,我必须确认一个用户电子邮件,该电子邮件在 ManyToOne 关系中可以正常工作,但事实并非如此。我使用的是相同的关系映射,但它给了我如上所示的空值。
@ManyToOne
@JoinColumn( name="user_id")
private User user;
我可以很好地上传文件,但我希望能够跟踪用户及其文件。
【问题讨论】:
标签: java mysql spring spring-boot hibernate