如何用JSP提供文件?
这可能听起来很愚蠢,但却是现实生活中的一个案例:(
我能够显示带有“虚拟”链接名称的HTML表格。
像这样的东西:
Xyz description document.doc Xyz description documentB.doc Xyz description documentC.doc
此doc id表示数据库中的id(对于这些docs存储在blob中为byte [])
无论如何。 我能够获取该ID,查询数据库并检索byte [](甚至将其存储在tmp文件中)
我无法弄清楚该怎么做,当用户点击链接时(以及我执行数据库检索后),将“[”]字节[]发送给用户。
现在最糟糕的部分,是什么让我在这里问这个问题,我需要用JSP(没有servlet)和没有第三方库(只是……不要问我为什么我也讨厌它)这样做
所以。 我如何在jsp中提供存储在服务器文件系统中的字节数组的二进制内容
我的第一位客人是:
我接近解决方案了吗?
这对客户端是否有效,就像他真的在服务器中点击了一个真正的文件一样?
提前致谢。
到目前为止,只需在JSP中编写与在Servlet类中相同的代码。 你几乎可以将它复制。 只确保您没有将任何模板文本写入流中,这包括scriptlet外部的换行符和空格。 否则它也会被写入二进制文件并破坏它。
如果您有多个scriptlet块,则需要对它们进行排列,以便在scriptlet的结尾%>
和下一个scriptlet的起始<%
之间没有换行符。 因此,例如
<%@page import="java.io.InputStream" %><% //... %>
代替
<%@page import="java.io.InputStream" %> <% //... %>
除了您提供的示例代码之外,您还需要在HTTP响应中设置MIME类型,如下所示。
response.setContentType("application/octet-stream");
注意,application / octet-stream MIME类型用于指示二进制文件。
拜托,拜托,请不要这样做。
你的用户正在受到伤害。
HTTP在文件方面做得非常丰富。 缓存,分块,随机访问等
看看像FileServlet这样的东西,然后锤击它以适应。 是的,它是一个Servlet,而不是一个JSP,但这是你想成为一个好的HTTP公民的目的。
有些容器可以使用其他选项,你可以破解Tomcats DefaultServlet等。
这样的东西……
InputStream instr = null; try { instr = new BufferedInputStream( new FileInputStream("file.txt") ); for(int x=instr.read(); x!=-1; x=instr.read()){ out.write(x); } } finally { out.close(); if( instr != null) instr.close(); }
您将需要此作为对单击的响应(在页面重新加载或在另一个jsp文件中)。
使用字节数组而不是一次使用字节数组,你可以做更好的缓冲解决方案……我会留给你的。
对不起,你被困在JSP scriptlet的土地上…希望这会有所帮助。