Ожидание создания файлов в Java - PullRequest
1 голос
/ 10 апреля 2019

Я работаю над веб-API (с Spring Boot), который конвертирует pdf с использованием внешнего API C ++, эта программа работает, но когда я хочу отправить файл в ответе тела, я получаю эту ошибку:

{
"timestamp": "2019-04-10T09:56:01.696+0000",
"status": 500,
"error": "Internal Server Error",
"message": "file [D:\\[Phenix-Monitor]1.pdf] cannot be resolved in the file system for checking its content length",
"path": "/convert/toLinPDf"}

Контроллер:

@PostMapping("/toLinPDf")
public ResponseEntity<ByteArrayResource> convertion(@RequestParam(value = "input", required = false) String in,
        @RequestParam(value = "output", required = false) String out) throws IOException, InterruptedException {
    linearizeService.LinearizePDf(in, out);
    FileSystemResource pdfFile = new FileSystemResource(out);
    return ResponseEntity
            .ok()
            .contentLength(pdfFile.contentLength())
            .contentType(
                    MediaType.parseMediaType("application/pdf"))
            .body(new ByteArrayResource(IOUtils.toByteArray(pdfFile.getInputStream())));

}

Я предполагаю, что проблема в linearizeService.LinearizePDf(in, out);, потому что в этом методе я использую внешний процесс, поэтому происходит то, что когда я пытаюсь открыть файл с FileSystemResource pdfFile = new FileSystemResource(out);, linearizeService еще не завершил обработку вот почему я получаю эту ошибку, мой вопрос: как я могу справиться с этим, я имею в виду, как ждать создания файла, а затем отправить этот файл?

1 Ответ

1 голос
/ 10 апреля 2019

Я предлагаю вам использовать Future API Java 8.

Вот обновление для вашего ресурса.

@PostMapping("/toLinPDf")
public ResponseEntity<ByteArrayResource> convertion(
    @RequestParam(value = "input", required = false) String in,
    @RequestParam(value = "output", required = false) String out) throws IOException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> callable = () -> {
        linearizeService.LinearizePDf(in, out);
        return "Task ended";
};
Future<String> future = executorService.submit(callable);
String result = future.get();
executorService.shutdown();
FileSystemResource pdfFile = new FileSystemResource(out);
return ResponseEntity
            .ok()
            .contentLength(pdfFile.contentLength())
            .contentType(
                    MediaType.parseMediaType("application/pdf"))
            .body(new ByteArrayResource(IOUtils.toByteArray(pdfFile.getInputStream())));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...