题
这可能听起来完全笨,但现实生活中的情况:(
我能够用一个“虚拟”链接名称显示一个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>
此文档id表示在数据库中的ID(对于这些文档被存储在团块如字节[])
反正。我能得到这个ID,查询数据库和检索的byte [](甚至其存储在tmp文件)
我想不出什么了怎么办,就是,当链接,在用户点击(之后我执行DB检索)“服务”的字节[]给用户。
现在最糟糕的一部分,是什么让我在这里问这个问题,我需要用JSP(不使用的servlet),并没有第三方库(只是要做到这一点......不要问我为什么讨厌它太)
因此。如何服务于一个jsp存储在服务器文件系统中的字节数组的二进制内容
我的第一客体是:
<%
InputStream read // read the file form the fle system
response.getOutputStream().write( theBytesReader );
%>
我是否接近溶液?
将这项工作,就好像他真的点击了在服务器中的实际文件的客户端?
预先感谢。
解决方案
要的地步,只写相同的代码在JSP中,你会在做的 Servlet类。你几乎可以copypaste它。只有确保您的不可以 writinig任何模板文本流,这包括小脚本外换行符和空白。否则,它会被写入到二进制文件以及与腐败了。
如果您有多个小脚本块,那么你需要它们,以便有一个小脚本的结束%>
和下一个小脚本的起始<%
之间没有断行安排。因此,e.g。
<%@page import="java.io.InputStream" %><%
//...
%>
,而不是
<%@page import="java.io.InputStream" %>
<%
//...
%>
其他提示
您需要设置MIME类型中除了你提供的示例代码像下面的HTTP响应。
response.setContentType("application/octet-stream");
请注意,应用程序/八位字节流MIME类型用于指示一个二进制文件。
请,请,请不要这么做。
您要对得住自己的用户。
HTTP是惊人的丰富,它可以用文件执行条款。缓存,组块,随机存取等
看看像 FileServlet 和锤子,为配合。是的,这是一个Servlet,而不是JSP,但是这是你想要做的是一个很好的HTTP公民的东西。
一些容器有可以使用其他选项,你可以破解雄猫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脚本的土地......希望这有助于。