0

我想内联提供 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();
    }

}

这是如何引起的,我该如何解决?

4

3 回答 3

1

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

于 2012-04-15T18:11:22.493 回答
0

至少 Internet Explorer 允许用户覆盖配置。您使用哪些浏览器进行测试?

您写入输出流的数据可能不完整,因为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 
          }
       }
    }

}
于 2012-04-15T18:54:46.403 回答
0

我认为有一种方法可以使用objectHTML 标签将 MS-Word 或 Excel 文档嵌入到 HTML 页面中,但我不知道即使在 Windows 上,不同浏览器之间的可移植性如何。此外,您可能必须使用 HTML 框架才能将其限制在页面上的某个区域。

如果这不是你想要的,你可以使用一些库自己转换它,或者使用像ScribdSlideshare这样的 API ,它允许你上传文档 - 也是 MS 格式 - 并取回一个可嵌入的片段。尽管那时您的数据由他们的服务托管。

于 2012-04-15T18:33:36.480 回答