Spring OutputStream — загрузка pptx с IE

#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-страницу:

откройте 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 файл. Надеюсь, код поможет вам, если у вас есть какие-либо вопросы или сомнения, мы можем обсудить или если есть какие-либо предложения. Спасибо