簡體   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