#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. Как вы загружаете файл в свой класс?