Скачать файл с REST API

Я пытаюсь разработать api, чтобы открыть файл, например word или pdf. Я тестирую этот API, но у меня ошибка ниже. Параметр, задаваемый swagger или front, аналогичен этому -> Z: \ Some \ Path \ To \ My \ File.docx.

Я пробовал этот файл pathFile в окнах explorateur, и он отлично работает.

ТРАССИРОВКИ СТЕКА

java.io.FileNotFoundException: InputStream resource [resource loaded through InputStream] cannot be resolved to absolute file path
    at org.springframework.core.io.AbstractResource.getFile(AbstractResource.java:114) ~[spring-core-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at ... .DownloadDocumentResource.downloadFile(DownloadDocumentResource.java:28) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_92]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_92]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_92]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_92]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]

КОНТРОЛЛЕР ОТДЫХА

@RestController
public class DownloadDocumentResource {

    @ResponseBody
    @RequestMapping(method = RequestMethod.POST, path = {"/download"})
    public ResponseEntity<InputStreamResource> downloadFile(@RequestBody String pathFile) throws IOException {
        out.println(pathFile);
        InputStreamResource resource = new InputStreamResource(new FileInputStream( pathFile));
        File fileToDownload = resource.getFile();


        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename = " + fileToDownload.getName())
                .contentLength(fileToDownload.length())
                .contentType(MediaType.parseMediaType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
                .body(resource);
    }

Я бы посоветовал вам замаскировать личную информацию, которую вы предоставляете (каталог, имя работодателя и т. д.)

Vincz777 25.04.2018 17:39

Спасибо Vincz777 за совет и Dan W за модификацию.

Nicolas HELIE 26.04.2018 11:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
2
28 450
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

СкачатьDocumentController

@RestController
@RequiredArgsConstructor
public class DownloadDocumentController {

    private static final String APPLICATION_MS_WORD_VALUE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    private final DownloadDocumentService downloadDocumentService;

    @PostMapping(value = "/download", produces = APPLICATION_MS_WORD_VALUE)
    public ResponseEntity<byte[]> downloadFile(@RequestBody String pathFile) throws IOException {
        byte[] content = downloadDocumentService.downloadFile(pathFile);

        return ResponseEntity.ok()
                             .contentLength(content.length)
                             .header(HttpHeaders.CONTENT_TYPE, APPLICATION_MS_WORD_VALUE)
                             .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename = " + "File.docx"))
                             .body(content);
    }
}

DownloadDocumentService

@Service
public class DownloadDocumentService {

    public byte[] downloadFile(String pathFile) {
        // TODO do read available resource and create byte[]
        return null;
    }

}

Я не могу проголосовать за вас, потому что, похоже, у меня недостаточно репутации. Так что, если админ может дать вам это, я изящно его благодарю

Nicolas HELIE 26.04.2018 11:13

Не волнуйся об этом. Это не является проблемой.

oleg.cherednik 26.04.2018 11:14

Очень простой подход! Спасибо!!

Harish 17.10.2018 01:13

Другие вопросы по теме