Загрузка файла XML с загрузкой Spring

#file #spring-boot #download

#файл #spring-boot #Скачать

Вопрос:

Я пытаюсь загрузить файлы с помощью интерфейса React, но метод в контроллере не загружает его

Метод работает, потому что он не запускает никаких исключений, и байтовый массив работает, но когда я закрываю потоки, загрузка не происходит

 public void downloadFile(@PathVariable("numeroOfferta") String numeroOfferta, @RequestParam(value="file") String file, HttpServletResponse response, HttpServletRequest req) throws IOException {


    String filePathToBeServed = 
    File fileToDownload = new File(filePathToBeServed   file);

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" file);
    response.setStatus(HttpServletResponse.SC_OK);

    try(FileInputStream in =  new FileInputStream(fileToDownload);
            OutputStream out = response.getOutputStream()) {

        byte[] buffer = new byte[4096];

        while ((in.read(buffer, 0, 4096)) != -1) {
            out.write(buffer, 0, 4096);
        }
        out.flush();
        out.close();
        in.close();
    }
  

NumeroOfferta — это просто строка, которую мне нужно ввести в папки, а file содержит имя файла, который я отправляю с веб-страницы.

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

Ответ №1:

Просто используйте Spring MVC ResponseEntity:

 public void downloadFile(@PathVariable("numeroOfferta") String numeroOfferta, 
                         @RequestParam(value="file") String file) {

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData(file, file);
    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");

    byte[] content = Files.readAllBytes(new File(filePathToBeServed   file).toPath());
    return new ResponseEntity(content, headers, HttpStatus.OK);
  

}

Вот и все.

Комментарии:

1. setContentType не принимает строковые значения, вы уверены, что мне нужно использовать заголовки, а не ресурс?

2. О, мне жаль, что я этого не видел. Я обновил свой ответ. Но почему вы возвращаете application / octet-stream, а не appcliation / xml?

3. Я возвращаю ПОТОК ОКТЕТОВ, потому что я не знаю, ЛОЛ, я попробую с XML. Большое спасибо

4. извините, если я вас беспокою, ваше решение работает, так что спасибо за это, но у меня все еще есть проблема. Фактически загружаемый файл поврежден, знаете ли вы какие-либо возможности, которые могут повредить файл? Мне нужно загрузить файлы xlsm, и я использую «application / vnd.ms-excel.sheet.macroEnabled.12» в типе содержимого

5. Как вы загружаете файл в свой класс?