The file data is stored in mysql.
Personally, I don’t like this method, because I can view the data such as see the picture or hear the mp3.
File.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "files")
public class File {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
private String name;
private String type;
@Lob
private byte[] data;
File(String name, String type, byte[] data) {
this.name = name;
this.type = type;
this.data = data;
}
}
FileRepository.java
@Repository
public interface FileRepository extends JpaRepository<File, String> {
}
FileService.java
@Service
public class FileService {
@Autowired
private FileRepository fileRepository;
public File store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
File FileDB = new File(fileName, file.getContentType(), file.getBytes());
return fileRepository.save(FileDB);
}
public File getFile(String id) {
return fileRepository.findById(id).get();
}
public Stream<File> getAllFiles() {
return fileRepository.findAll().stream();
}
}
FileController.java
@RestController
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/upload")
public ResponseEntity<FileResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {
String message = "";
try {
fileService.store(file);
message = "Uploaded the file successfully: " + file.getOriginalFilename();
return ResponseEntity.status(HttpStatus.OK).body(new FileResponseMessage(message));
} catch (Exception e) {
message = "Could not upload the file: " + file.getOriginalFilename() + "!";
return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new FileResponseMessage(message));
}
}
@GetMapping("/files")
public ResponseEntity<List<FileResponse>> getListFiles() {
List<FileResponse> files = fileService.getAllFiles().map(dbFile -> {
String fileDownloadUri = ServletUriComponentsBuilder
.fromCurrentContextPath()
.path("/files/")
.path(dbFile.getId())
.toUriString();
return new FileResponse(
dbFile.getName(),
fileDownloadUri,
dbFile.getType(),
dbFile.getData().length);
}).collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK).body(files);
}
@GetMapping("/files/{id}")
public ResponseEntity<byte[]> getFile(@PathVariable String id) {
File f = fileService.getFile(id);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + f.getName() + "\"")
.body(f.getData());
}
}
FileResponse.java
@Data
@AllArgsConstructor
public class FileResponse {
private String name;
private String url;
private String type;
private long size;
}
FileResponseMessage.java
@Data
@AllArgsConstructor
public class FileResponseMessage {
private String message;
}
FileControllerExceptionHandler.java
@RestControllerAdvice
public class FileControllerExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity<FileResponseMessage> handleMaxSizeException(MaxUploadSizeExceededException exc) {
return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new FileResponseMessage("File too large!"));
}
}
Results