【发布时间】:2020-11-19 12:08:08
【问题描述】:
我是 Java 和 Spring Framework 的新手,我正在通过一个文件上传示例来学习它。我有一个用于上传文件的控制器。在将任何内容保存到 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";
}
这是 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; }
}
【问题讨论】:
-
请发布完整的异常堆栈跟踪。
File的类型是什么?是java.io.File,那么这很可能是错误的原因:它不是从数据库输出转换为的合适类型。另外,您是否考虑过在文件名列上添加唯一约束并尝试插入?这将产生一个错误,而无需先检查。 -
我觉得
fileService.createFile(fileUpload, userId);也是相关代码,需要在这里分享。见stackoverflow.com/help/minimal-reproducible-example -
请添加文件类
-
我添加了 File 类和 repo 的链接
标签: java spring-boot h2