java检查数据库中是否已经存在项
我是Java和Spring框架的新手,我正在通过一个文件上传示例学习它。我有一个上传文件的控制器。在将任何内容保存到DB之前,我想检查同名文件是否已经存在,并返回一条错误消息。以下是控制器的外观:
@PostMapping("/file-upload")
public String postFile(@RequestParam("fileUpload") MultipartFile fileUpload, Authentication authentication, Model model) throws IOException {
if(fileUpload.isEmpty()) {
model.addAttribute("success",false);
model.addAttribute("message","No file selected to upload!");
return "home";
}
if(fileService.getByFilename(fileUpload.getOriginalFilename()) != null) {
model.addAttribute("success",false);
model.addAttribute("message","File with that name already exists");
return "home";
}
User user = this.userService.getUser(authentication.getName());
Integer userId = user.getUserId();
fileService.createFile(fileUpload, userId);
model.addAttribute("success",true);
model.addAttribute("message","New File added successfully!");
return "home";
}
这是fileServicegetByFilename方法:
public File getByUsername(String filename) {
return fileMapper.getByUsername(filename);
}
最后是fileMappergetByFilename:
@Select("SELECT * FROM FILES WHERE filename = #{filename}")
File getByUsername(String filename);
但是,当我试图上传这样的文件时,我得到了一个错误:
There was an unexpected error (type=Internal Server Error, status=500). Error attempting to get column 'FILEDATA' from result set. Cause: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting
这是桌子的样子:
CREATE TABLE IF NOT EXISTS FILES (
fileId INT PRIMARY KEY auto_increment,
filename VARCHAR,
contenttype VARCHAR,
filesize VARCHAR,
userid INT,
filedata BLOB,
foreign key (userid) references USERS(userid)
);
我该怎么解决这个问题? 这里是到repo的链接
这是文件类:
package com.udacity.jwdnd.course1.cloudstorage.model;
public class File {
private Integer fileId;
private String filename;
private String contenttype;
private Long filesize;
private byte[] filedata;
private Integer userid;
public File(Integer fileId, String filename, String contenttype, Long filesize, byte[] filedata, Integer userid) {
this.fileId = fileId;
this.filename = filename;
this.contenttype = contenttype;
this.filesize = filesize;
this.filedata = filedata;
this.userid = userid;
}
public Integer getFileId() {
return fileId;
}
public void setFileId(Integer fileId) {
this.fileId = fileId;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getContenttype() {
return contenttype;
}
public void setContenttype(String contenttype) {
this.contenttype = contenttype;
}
public Long getFilesize() {
return filesize;
}
public void setFilesize(Long filesize) {
this.filesize = filesize;
}
public byte[] getFiledata() {
return filedata;
}
public void setFiledata(byte[] filedata) {
this.filedata = filedata;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) { this.userid = userid; }
}
# 1 楼答案
表的结构强烈表明,一行包含所有数据:它根本不代表文件,文件系统中没有文件。:在
filedata
列中有一堆二进制数据不可能仅仅将其视为java。伊奥。File对象,它是文件系统中物理文件的一个非常轻巧的包装器(真的,只需检查一下,File有一个String类型的字段,包含一个路径。这就是它的全部内容)
所以你不能在这里随心所欲。你需要找到一个替代方案:
将数据保存到实际文件中
这涉及到在磁盘上有某种存储,可能是一个tmp dir,在那里可以显式地写出所有blob数据。你需要担心清理掉这些东西,否则你会在里面增加无穷无尽的文件
谁在乎文件
为什么需要文件对象?你应该把软件设计得尽可能抽象,而“我需要一个文件”很少是正确的级别。正确的级别通常是“字节数组”或“输入流”或类似的级别。修复你的程序流,使它们只需要一个字节数组,或者更好的是一个inputstream,并使用JDBC的blob功能来解决这个问题(我实际上不知道如何使用spring解锁这个问题;你可能需要编写一些代码,而不仅仅是一个
@Select
注释的方法