#java #spring-mvc #stream #java-8
#java #spring-mvc #поток #java-8
Вопрос:
Я использую этот Java-код для загрузки файлов из веб-приложения:
@RequestMapping(value = "/filedownloads/filedownload/{userid}/{projectid}/{documentfileid}/{version}/", method = RequestMethod.GET)
public void filesDownload(final @PathVariable("userid") String userId, final @PathVariable("projectid") String projectId,
final @PathVariable("documentfileid") String documentFileId, final @PathVariable("version") String version,
final HttpServletResponse response) throws IOException, BusinessException {
...
final String fileName = "filename=" documentFile.getFileName();
final InputStream is = new FileInputStream(filePath);
response.setHeader("Content-Disposition", "inline; " fileName);
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
}
если я загружу pptx-файл, я получу следующую IE-страницу:
Что я хочу сделать, так это открыть загруженный файл в Powerpoint. Теперь мой вопрос заключается в том, есть ли настройка заголовка для открытия этого файла с помощью правильного приложения (в данном случае Powerpoint)
Ответ №1:
Просто попробуйте правильно установить Content Type
заголовок, который application/vnd.openxmlformats-officedocument.presentationml.presentation
указан в случае a pptx
, как следующий:
response.setContentType(
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
);
response.setHeader(
"Content-Disposition",
String.format("inline; filename="%s"", documentFile.getFileName())
);
response.setContentLength((int) new File(filePath).length());
Вот список типов mime, соответствующих документам Office 2007.
Ответ №2:
Вот небольшой пример кода из контроллера Spring MVC:
@RequestMapping("/ppt")
public void downloadPpt(HttpServletRequest request, HttpServletResponse response) throws IOException {
Resource resource = new ClassPathResource("Presentation1.pptx");
InputStream resourceInputStream = resource.getInputStream();
response.setHeader("Content-Disposition", "attachment; filename="Presentation1.pptx"");
response.setContentLengthLong(resource.contentLength());
byte[] buffer = new byte[1024];
int len;
while ((len = resourceInputStream.read(buffer)) != -1) {
response.getOutputStream().write(buffer, 0, len);
}
}
Устанавливая значение Content-Disposition
to attachment
, вы указываете браузеру загрузить этот файл в виде вложения, а указав правильное имя файла с расширением, вы указываете операционной системе использовать любое приложение, которое пользователь обычно использует для открытия файла этого типа. В этом случае это будет MS Power Point.
Таким образом, вам может сойти с рук незнание того, с какой версией Power Point был создан файл.
Ответ №3:
Я протестировал код в IE-11
его работе нормально. Смотрите ниже код, т.Е.
@RequestMapping(value = "/downloadfile", method = RequestMethod.GET)
@ResponseBody
public void downloadfile(HttpServletRequest request, HttpServletResponse response) throws Exception {
ServletOutputStream servletOutputStream = null;
try {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=downloadppt.pptx");
byte[] ppt = downloadFile();
servletOutputStream = response.getOutputStream();
servletOutputStream.write(ppt);
} catch (Exception e) {
throw e;
} finally {
servletOutputStream.flush();
servletOutputStream.close();
}
}
Генерировать bytes
из сохраненного pptx
файла.
public byte[] downloadFile() throws IOException {
InputStream inputStream = new FileInputStream(new File("e:/testppt.pptx"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// Transfer bytes from source to destination
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
byteArrayOutputStream.write(buf, 0, len);
}
inputStream.close();
byteArrayOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
Вот и все, вы можете загрузить pptx
файл. Надеюсь, код поможет вам, если у вас есть какие-либо вопросы или сомнения, мы можем обсудить или если есть какие-либо предложения. Спасибо