Вопрос: Как приостановить получение запросов от пользователя до завершения операции?
<img th:src="@{/files/{id}(id=${file.Id})}">
@RestController
@RequestMapping("/files")
@AllArgsConstructor
public class FileController {
private final FileService fileService;
@GetMapping("/{id}")
public ResponseEntity<?> getById(@PathVariable int id) {
Optional<FileDto> fileDtoOptional = fileService.findById(id);
if (fileDtoOptional.isEmpty()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(fileDtoOptional.get().content());
}
}
@Service
public class SimpleFileService implements FileService {
private final String storageDirectory;
private final FileRepository fileRepository;
public SimpleFileService(@Value("${file.directory}") String storageDirectory, FileRepository fileRepository) {
this.storageDirectory = storageDirectory;
createStorageDirectory(storageDirectory);
this.fileRepository = fileRepository;
}
private void createStorageDirectory(String storageDirectory) {
try {
Files.createDirectories(Path.of(storageDirectory));
} catch (IOException e) {
// обработать ошибку, залогировать например
}
}
@Override
public Optional<FileDto> findById(int id) {
Optional<File> fileOptional = fileRepository.findById(id);
if (fileOptional.isEmpty()) {
return Optional.empty();
}
byte[] content = readFileAsByte(fileOptional.get().getPath());
return Optional.of(new FileDto(fileOptional.get().getName(), content));
}
private byte[] readFileAsByte(String path) {
try {
return Files.readAllBytes(Path.of(storageDirectory, path));
} catch (IOException e) {
// обработать ошибку, залогировать например
}
}
}
public record FileDto(String name, byte[] content) {
}