我想在线提供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();
}
}
这是如何引起的?如何解决?
答案 0 :(得分:1)
不可能在页面内呈现原始MS文档,除非有一些允许这样的客户端插件(类似于Flash为视频和游戏提供的内容)。我不知道这样的插件。您可能需要将文档转换为HTML,然后将其写回客户端。
答案 1 :(得分:0)
我认为有一种方法可以使用object
HTML标记将MS-Word或Excel文档嵌入到HTML页面中,但我不知道即使在Windows上,也是如此便携浏览器。此外,您可能需要使用HTML框架将其限制在页面上的某个区域。
如果这不是您想要的,您可以使用某些库自行转换,也可以使用Scribd或Slideshare之类的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
}
}
}
}