这可能听起来完全笨,但现实生活中的情况:(

我能够用一个“虚拟”链接名称显示一个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脚本的土地......希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top