ОСНОВЫ
Это приложение Java 1.8
Spring Boot 1.5
.
В настоящее время он использует Apache Tika 1.22
для чтения информации Mime-Type, но это можно легко изменить.
РЕЗЮМЕ
Существует картограф, которыйПользователь использует для загрузки файлов.Эти файлы приходят из другого URL
отдельно от приложения.Файл может быть разных типов (excel
, PDF
, text
и т. Д.), И приложение не может знать, каким оно будет, пока не извлечет файл.
ISSUE
Чтобы вернуть пользователю файл с соответствующим названием, расширением и ContentType
, приложение использует Apache Tika
для извлечения этой информации.К сожалению, теперь, когда заголовок InputStream
используется, когда приложение записывает InputStream
в HttpServletResponse
, файл является неполным.
Это означает, что для того, чтобы функционировать в настоящее время, приложение закрывает первый InputStream
, а затем открывает второй InputStream
для возврата пользователю.
Это нехорошо, потому что это означаетчто URL
вызывается дважды, что приводит к потере системных ресурсов.
Как правильно использовать эту функцию?
ПРИМЕР КОДА
@GetMapping("/My/Download/")
public void doDownload(HttpServletResponse httpServletResponse) {
String externalFileURL = "http://www.pdf995.com/samples/pdf.pdf";
try {
InputStream firstStream = new URL(externalFileURL).openStream();
TikaConfig tikaConfig = new TikaConfig();
MediaType mediaType = tikaConfig.getDetector().detect(TikaInputStream.get(firstStream), new Metadata());
firstStream.close();
InputStream secondStream = new URL(externalFileURL).openStream();
httpServletResponse.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", "DownloadMe." + mediaType.getSubtype()));
httpServletResponse.setContentType(mediaType.getBaseType().toString());
FileCopyUtils.copy(secondStream, httpServletResponse.getOutputStream());
httpServletResponse.flushBuffer();
} catch (Exception e) {
}
}