【问题标题】:How to serve a file with JSP?如何使用 JSP 提供文件?
【发布时间】:2011-01-08 00:58:17
【问题描述】:

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

我可以显示一个带有“虚拟”链接名称的 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 );
%>

我接近解决方案了吗?

这对客户来说会起作用吗,就好像他真的在服务器中单击了一个真实文件一样?

提前致谢。

【问题讨论】:

    标签: java jsp jakarta-ee binary-data


    【解决方案1】:

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

    如果您有多个 scriptlet 块,那么您需要对它们进行排列,以便在一个 scriptlet 的结尾 %&gt; 和下一个 scriptlet 的开头 &lt;% 之间没有换行符。因此,例如

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

    而不是

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

    【讨论】:

    • 按照BalusC的指示将代码放入JSP文件中,但使用out.clear();清除输出,而不是搞乱页面格式。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我已经有了,实际上我正在使用:application/vnd.ms-excel,但我真正的问题是,这种方法行得通吗? (使用 response.out 读写?)
    • 实际上,人们经常这样做是为了提供动态图像,其中您有一个类似于 /foo/bar/yourImage.jsp 的图像 URL,它通过返回图像的字节动态地提供图像以及设置 image/gif 或类似的内容类型。
    【解决方案3】:

    请,请,请不要这样做。

    你在伤害你的用户。

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

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

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

    【讨论】:

    • 这不是对我的问题的回答,而是评论,我知道这可以通过 servlet 来实现,但是如果您阅读我的问题,这不是一个选项 :( 很抱歉,但您的答案没有帮助
    • JSP 是一个 servlet,您几乎可以将 99% 的代码嵌入到您的 JSP 中并获得相同的结果。
    【解决方案4】:

    这样的……

    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 领域...希望这会有所帮助。

    【讨论】:

    • 您需要在响应中设置 MIME 类型,就像在我的示例中一样。
    • 真的...我假设那部分,不过感谢您的澄清。
    猜你喜欢
    • 2011-11-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多