Якщо ви:
- Не хочуть завантажувати весь файл у a,
byte[]
перш ніж надсилати відповідь;
- Хочете / потрібно надіслати / завантажити через
InputStream
;
- Хочете мати повний контроль над типом Mime та назвою файлу;
- Попросіть інших
@ControllerAdvice
винятків для вас (чи ні).
Нижче наведений код:
@RequestMapping(value = "/stuff/{stuffId}", method = RequestMethod.GET)
public ResponseEntity<FileSystemResource> downloadStuff(@PathVariable int stuffId)
throws IOException {
String fullPath = stuffService.figureOutFileNameFor(stuffId);
File file = new File(fullPath);
long fileLength = file.length(); // this is ok, but see note below
HttpHeaders respHeaders = new HttpHeaders();
respHeaders.setContentType("application/pdf");
respHeaders.setContentLength(fileLength);
respHeaders.setContentDispositionFormData("attachment", "fileNameIwant.pdf");
return new ResponseEntity<FileSystemResource>(
new FileSystemResource(file), respHeaders, HttpStatus.OK
);
}
Щодо частини довжини файлу : File#length()
у загальному випадку має бути достатньо хорошою, але я подумав, що я буду робити це спостереження, оскільки це може бути повільним , і в цьому випадку ви повинні зберігати його раніше (наприклад, у БД). Справи, які можуть бути повільними, включають: якщо файл великий, особливо якщо файл знаходиться у віддаленій системі або щось більш досконале, як це - база даних, можливо.
InputStreamResource
Якщо ваш ресурс не є файлом, наприклад, ви збираєте дані з БД, ви повинні використовувати InputStreamResource
. Приклад:
InputStreamResource isr = new InputStreamResource(new FileInputStream(file));
return new ResponseEntity<InputStreamResource>(isr, respHeaders, HttpStatus.OK);