【问题标题】:Check if item already exists in DB检查项目是否已存在于数据库中
【发布时间】: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


【解决方案1】:

您的表结构强烈表明单行包含所有数据:它确实代表一个文件,并且您的文件系统上没有文件filedata列中有一堆二进制数据。

不可能只将其视为 java.io.File 对象,它是文件系统上物理文件的一个非常轻量级的包装器(真的 - 只需检查一下,File 有一个字段,类型为 String , 包含路径。仅此而已)。

因此你不能在这里做你想做的事。您需要找到替代方案:

将数据保存到实际文件中

这涉及在磁盘上存储某种存储,可能是 tmp 目录,您可以在其中明确写出所有 blob 数据。你需要担心清除这些东西,否则你会在那里增长无穷无尽的文件。

谁在乎文件?

为什么你需要一个文件对象?您应该将软件构建得尽可能抽象,而“我需要一个文件”很少是正确的。正确的级别通常是“字节数组”或“输入流”或类似的东西。修复您的程序流程,以便它们只需要一个字节数组或更好的输入流,并使用 JDBC 的 blob 功能来处理这个问题(我实际上不知道如何使用 spring 解锁它;您可能需要编写一些代码而不是只是一个 @Select 注释方法。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2020-02-03
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多