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
相关产品推荐
相关产品推荐

