繁体   English   中英

检查项目是否已存在于数据库中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM