#java #spring #file
#java #весна #файл
Вопрос:
Я создаю приложение spring boot, которое отправляет файл в ответ на тело, для этого я использую этот код :
FileSystemResource pdfFile = new FileSystemResource(outputFile);
return ResponseEntity
.ok()
.contentLength(pdfFile.contentLength())
.contentType(MediaType.parseMediaType("application/pdf"))
.body(new ByteArrayResource(IOUtils.toByteArray(pdfFile.getInputStream())));
Мне интересно, есть ли какой-либо альтернативный способ отправки файла, кроме использования FileSystemResource?
Пожалуйста, если есть какие-либо предложения, не стесняйтесь.
Спасибо!
Ответ №1:
Это упрощенная версия того, как я обычно это делаю, но она делает практически то же самое:
@RequestMapping(method = RequestMethod.GET, value = "/{id}")
public ResponseEntity<byte[]> getPdf(@PathVariable Long id) throws IOException {
final String filePath = pdfFilePathFinder.find(id);
final byte[] pdfBytes = Files.readAllBytes(Paths.get(filePath));
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
headers.setContentDispositionFormData("attachment", null);
headers.setCacheControl("no-cache");
return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
}
Комментарии:
1. У меня есть вопрос в этой инструкции: < последний байт[] pdfBytes = Files.ReadAllBytes(Paths.get(filePath));> » путь к файлу» — это абсолютный или относительный путь?
2. Абсолютный. Я не знаю, работает ли он также с относительными путями, но в любом случае есть способы создать
Path
s из ресурсов classpath, которые вы затем можете отправитьFiles#readAllBytes
. Но это уже другая тема, на которую уже отвечали в другом месте.