一、介绍
之所以说是简单呢,是因为文件上传后直接以二进制的方式存入数据库中,下载的时候再转成文件。
采用springboot, springdata实现。
二、具体实现
controller层
upload
@Autowired
private MyFileDao myFileDao;
@PostMapping(value = "file")
@ResponseBody
public ResponseEntity<?> uploadFile(@RequestParam MultipartFile file) {
//利用一个对象去存储文件的二进制
MyFile myFile = new MyFile();
myFile.setFile(file.getBytes());
myFile.setFileName(file.getOriginalFilename());
myFileDao.save(myFile);
return new ResponseEntity<>(HttpStatus.OK);
}
复制代码
download
@GetMapping(value = "file")
@ResponseBody
public ResponseEntity<?> downloadFile(@RequestParam Long id){
ResponseEntity responseEntity;
Optional<MyFile> myFile = myFileDao.findById(id);
byte[] fileByte = myFile.get().getFile();
//设置header很关键,就是告诉浏览器你返回的是文件
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition","attachment;filename="+myFile.get().getFileName());
responseEntity = new ResponseEntity<>(fileByte, headers, HttpStatus.OK);
return responseEntity;
}
复制代码
我把service层省略了
dao层
public interface MyFileDao extends CrudRepository<MyFile, Long> {
}
复制代码
entity
@Entity
public class MyFile {
private Long id;
private String fileName;
private byte[] file;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
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[] getFile() {
return file;
}
public void setFile(byte[] file) {
this.file = file;
}
}
复制代码
三、总结
这里只是简单的把文件的二进制存入关系型数据库中,貌似大多数情况下不这样存,我也只是业务的需要才这样处理了。 刚开始的时候我总想着怎么处理流巴拉巴拉一堆,最后起身倒了杯水,不急着找资料,而是站在一个高的视角去审视我的动机,我想干什么,存文件到数据库,二进制,所以我还处理什么锤子流啊,然后一步搞定,这么简答的一个问题花费我几个小时,自己想的复杂了呀。
THINK TWICE,CODE ONCE. 三思而后敲啊!