[英]Check if item already exists in DB
我是 Java 和 Spring Framework 的新手,我正在通过文件上传示例学习它。 我有一个用于上传文件的控制器。 在将任何内容保存到数据库之前,我想检查同名文件是否已存在并为其返回错误消息。 这是控制器的样子:
@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";
}
这是 fileService getByFilename方法:
public File getByUsername(String filename) {
return fileMapper.getByUsername(filename);
}
最后 fileMapper getByFilename :
@Select("SELECT * FROM FILES WHERE filename = #{filename}")
File getByUsername(String filename);
但是,当我尝试上传这样的文件时,出现错误:
出现意外错误(类型=内部服务器错误,状态=500)。 尝试从结果集中获取列“FILEDATA”时出错。 原因:org.h2.jdbc.JdbcSQLDataException:数据转换错误转换
这是表的样子:
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; }
}
你的表的结构有力地表明,单排包含所有数据:它并不代表所有文件,并没有在文件系统上没有文件:有一个在一堆二进制数据的filedata
列。
不可能仅仅将它视为一个 java.io.File 对象,它是文件系统上物理文件的一个非常轻量级的包装器(实际上 - 只需检查一下,File 有一个 String 类型的字段,其中包含一个路径。这就是它所拥有的)。
因此,你不能在这里做你想做的事。 你需要找到一个替代方案:
这涉及在磁盘上进行某种存储,可能是 tmp 目录,您可以在其中明确写出所有 blob 数据。 你需要担心清除这些东西,否则你会在那里增长无穷无尽的文件。
为什么需要文件对象? 您应该将软件构建为当时看起来合理的抽象,并且“我需要一个文件”很少是正确的级别。 正确的级别通常是“字节数组”或“输入流”或类似的东西。 修复您的程序流,以便他们只需要一个字节数组或更好的输入流,并使用 JDBC 的 blob 功能来处理这个问题(我实际上不知道如何使用 spring 来解锁它;您可能需要编写一些代码而不是只是一个@Select
注释的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.