我在服务器端有一个Excel文件。如何使用servlet在客户端浏览器上显示它?
提前致谢。
答案 0 :(得分:23)
要点:只是以某种方式得到InputStream
(FileInputStream
是合适的),并以通常的Java IO方式将其写入响应的OutputStream
。这基本上都是。您只需要注意设置正确的响应标头,以便浏览器了解如何处理它。 Content-Type
标题将指示webbrowser它是什么类型的文件,以便浏览器知道用于打开它的应用程序。
这是一个启动示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = URLDecoder.decode(request.getPathInfo(), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", file.length());
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(new FileInputStream(file));
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[8192];
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException ignore) {}
if (input != null) try { input.close(); } catch (IOException ignore) {}
}
}
在web.xml
的{{1}} url-pattern
上将此servlet映射到/files/*
,以便您可以http://example.com/contextname/files/filename.xls
获取excel文件。
如果它实际上是一个xlsx
文件,默认情况下不会被普通的servletcontainer识别(ServletContext#getMimeType()
将返回application/octet-stream
而不是所需的xlsx
内容类型),然后您还需要将以下条目添加到web.xml
:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
对于文件servlet的更高级示例,您可能会发现this article也很有用,它也支持每个下载简历。