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(); } }
|