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