8

这听起来可能很愚蠢,但这是现实生活中的一个例子:(

我能够显示一个带有“虚拟”链接名称的 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(因为这些文档以 byte[] 形式存储在 blob 中)

反正。我能够获取该 ID,查询数据库并检索 byte[](甚至将其存储在 tmp 文件中)

我不知道该怎么做,当用户单击链接时(并且在我执行数据库检索之后)“服务”字节 [] 给用户。

现在最糟糕的部分,让我在这里问这个问题的是,我只需要使用 JSP(没有 servlet)而不需要 3rd 方库(只是......不要问我为什么我也讨厌它)

所以。如何在 jsp 中提供存储在服务器文件系统中的字节数组的二进制内容

我的第一位客人是:

<%
InputStream read // read the file form the fle system 
response.getOutputStream().write( theBytesReader );
%>

我接近解决方案了吗?

这对客户端是否有效,就好像他真的在服务器中单击了一个真实文件一样?

提前致谢。

4

4 回答 4

5

至此,只需在 JSP 中编写与在Servlet 类中相同的代码即可。您实际上可以复制粘贴它。只需确保您没有将任何模板文本写入流,这包括小脚本之外的换行符和空格。否则它也会被写入二进制文件并损坏它。

如果您有多个 scriptlet 块,则需要对它们进行排列,以便在 scriptlet 的结尾%>和下一个 scriptlet 的开始之间没有换行符<%。因此,例如

<%@page import="java.io.InputStream" %><%
    //...
%>

代替

<%@page import="java.io.InputStream" %>
<%
    //...
%>
于 2010-01-22T02:29:21.977 回答
2

除了您提供的示例代码之外,您还需要在 HTTP 响应中设置 MIME 类型,如下所示。

response.setContentType("application/octet-stream");

注意,application/octet-stream MIME 类型用于指示二进制文件。

于 2010-01-22T02:16:47.323 回答
2

请,请,请不要这样做。

你在伤害你的用户。

HTTP 在处理文件方面非常丰富。缓存、分块、随机访问等。

看一下FileServlet 之类的东西,然后锤击它以适应。是的,它是一个 Servlet,而不是一个 JSP,但这是成为一个优秀的 HTTP 公民所要做的。

有些容器还有其他选项可供您使用,您可以破解 Tomcats DefaultServlet 等。

于 2010-01-22T05:24:37.347 回答
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 领域...希望这会有所帮助。

于 2010-01-22T02:16:23.117 回答