Spring完成文件的存储和下载

文件的存储

  • 使用数据库存储文件本体
  • 使用数据库存储文件的位置,文件存储在文件系统上

使用数据库直接存储文件,使用LONGBLOB类型保存文件的Byte数据

文件的接收

前端使用form上传数据

ContentType : multipart/form-data 使用 @RequestPart 注解接收文件

@PostMapping("/upload")
public ResponseEntity<Object> uploadFile(@RequestPart MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
fileName = fileName.substring(0, fileName.lastIndexOf("."));
fileMapper.uploadFile(fileName, suffix, file.getBytes());
return new ResponseEntity(HttpStatusCode.valueOf(200));
}

文件的下载

  • 文件存储于数据库

使用Jdbc获取文件的LONGBLOB,在Java中使用byte[]数组接收数据

@GetMapping("/download/{filename}")
public void downloadFile(@PathVariable() String filename, HttpServletResponse response) throws IOException {
filename = filename.substring(0, filename.lastIndexOf(".") == -1 ? filename.length() : filename.lastIndexOf("."));
File file = jdbcTemplate.queryForObject("SELECT * FROM FileStorage WHERE file_name = ?", new Object[]{filename},
(resultSet, rowNum) -> {
File tfile = new File();
tfile.setFileId(resultSet.getInt("file_id"));
tfile.setFileName(resultSet.getString("file_name"));
tfile.setFileType(resultSet.getString("file_type"));
tfile.setFileData(resultSet.getBytes("file_data"));
return tfile;
}
);

byte[] fileData = file.getFileData();

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"file"+file.getFileType()+"\"");

if(fileData != null){
ServletOutputStream stream = response.getOutputStream();
stream.write(fileData);
stream.flush();
}
}