You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot无法正确解析MultipartFile:文件上传后内容异常求助

文件上传后数据库存储内容异常排查求助

问题现象

上传内容为TESTTEXT的文本文件testtext.txt,Firefox抓包显示请求内容正常,但MySQL数据库中存储的内容为0x54455354544558540A,比原内容多了一个换行符(0x0A);上传图片时也存在同样问题,存储的文件数据始终比原文件大,下载后无法正常打开。


前端上传代码

function upload() {
    let data = new FormData();
    data.append("file", refs.inputFile.current.files[0]);

    let config = {
        headers: {
        "Content-Type" : "multipart/form-data"
        }
    };

    console.log(data);

    axios.post("http://localhost:8080/upload",
           data)
        .then((res) => {
        console.log(res.data);
        })
        .catch((err) => {
        console.log(err.message);
        });
}

后端代码

Controller层代码

@PostMapping(path = "/upload")
public String upload(
        @RequestParam("file") MultipartFile file) throws IOException {
    if(repo.existsByFilename(file.getOriginalFilename())) {
        return "File already exists.";
    } else {
        Model m = new Model(
                file.getOriginalFilename(),
                file.getBytes()
                );
        repo.save(m);
        return "File named " + file.getOriginalFilename() + " is saved.";
    }
}

Model实体类代码

@Entity
@Table(name = "test")
public class Model {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private String filename;

    @Lob
    @Column(columnDefinition = "longblob")
    private byte[] data;

    public Model() {
        super();
    }

    public Model(String filename, byte[] data) {
        super();
        this.filename = filename;
        this.data = data;
    }

    public Model(Long id, String filename, byte[] data) {
        super();
        this.id = id;
        this.filename = filename;
        this.data = data;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }
}

请求与数据库存储详情

Firefox中捕获的请求内容:

-----------------------------3431304631829148335501350923
Content-Disposition: form-data; name="file"; filename="testtext.txt"
Content-Type: text/plain

TESTTEXT

-----------------------------3431304631829148335501350923--

MySQL数据库中存储的二进制内容:

0x54455354544558540A

前端下载代码

function download(filename) {
    console.log(filename);
    axios({
        url: "http://localhost:8080/api/dataupdown/download",
        method: "GET",
        params: {
        filename: filename
        }
    }).then((res) => {
        const url = window.URL.createObjectURL(new Blob([res.data.data]));
        const link = document.createElement("a");
        link.href = url;
        link.setAttribute("download", res.data.filename);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    });
}

内容的提问来源于Stack Exchange,提问作者Quorthon Plavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:47