如何用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的土地上…希望这会有所帮助。