有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    表的结构强烈表明,一行包含所有数据:它根本不代表文件,文件系统中没有文件。:在filedata列中有一堆二进制数据

    不可能仅仅将其视为java。伊奥。File对象,它是文件系统中物理文件的一个非常轻巧的包装器(真的,只需检查一下,File有一个String类型的字段,包含一个路径。这就是它的全部内容)

    所以你不能在这里随心所欲。你需要找到一个替代方案:

    将数据保存到实际文件中

    这涉及到在磁盘上有某种存储,可能是一个tmp dir,在那里可以显式地写出所有blob数据。你需要担心清理掉这些东西,否则你会在里面增加无穷无尽的文件

    谁在乎文件

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