如何内联而不是作为附件提供MS Office文档?

时间:2012-04-15 17:46:10

标签: java servlets ms-office mime-types

我想在线提供MS文档,而不是通过附件提供它。我根据文档类型定义了应用程序mime类型,但客户端仍尝试下载它。这是我的代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream is = null;
    String fileName = "file.docx";

    try {
        java.io.File file = new java.io.File("C:/"+fileName);

        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        byte[] bytes = new byte[in.available()];
        in.read(bytes);
        in.close();

        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.addHeader("Content-Disposition", "inline;filename=\"" + fileName + "\"");

        response.getOutputStream().write(bytes);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

这是如何引起的?如何解决?

3 个答案:

答案 0 :(得分:1)

不可能在页面内呈现原始MS文档,除非有一些允许这样的客户端插件(类似于Flash为视频和游戏提供的内容)。我不知道这样的插件。您可能需要将文档转换为HTML,然后将其写回客户端。

答案 1 :(得分:0)

我认为有一种方法可以使用object HTML标记将MS-Word或Excel文档嵌入到HTML页面中,但我不知道即使在Windows上,也是如此便携浏览器。此外,您可能需要使用HTML框架将其限制在页面上的某个区域。

如果这不是您想要的,您可以使用某些库自行转换,也可以使用ScribdSlideshare之类的API,这些API允许您上传文档(也是MS格式)和找回一个可嵌入的代码片段。虽然那时你的数据是由他们的服务托管的。

答案 2 :(得分:0)

至少Internet Explorer允许用户overwrite the disposition。 你用过哪些浏览器进行测试?

您写入输出流的数据可能不完整,因为in.available()可能小于文件大小。来自InputStream的JavaDoc

  

返回可读取的字节数的估计值(或   从此输入流中跳过)而不会被下一个阻塞   调用此输入流的方法。

如果要读取整个块,请使用文件对象中的文件大小。 告诉客户端文件的大小也是个好主意。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream is = null;
    String fileName = "file.docx";
    BufferedInputStream in = null;

    try {
        java.io.File file = new java.io.File("C:/"+fileName);
        // not the best way
        int length = (int)file.length();

        in = new BufferedInputStream(new FileInputStream(file));
        // may allocate a huge ammout of memory
        byte[] bytes = new byte[length];
        in.read(bytes);
        in.close();
        in = null;

        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.addHeader("Content-Disposition", String.format("inline; filename=\"%s\" ; size=\"%d\"", fileName, length));

        response.getOutputStream().write(bytes);
        response.getOutputStream().flush();

    } catch (Exception e) {
        e.printStackTrace();
        throw new ServletException(e);
    } finally { 
       if (in != null) {
          try {
             in.close();
          } catch (IOException e) {
              e.printStackTrace();
              // ignore 
          }
       }
    }

}