Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JSP提供文件服务?_Java_Jsp_Jakarta Ee_Binary Data - Fatal编程技术网

Java 如何使用JSP提供文件服务?

Java 如何使用JSP提供文件服务?,java,jsp,jakarta-ee,binary-data,Java,Jsp,Jakarta Ee,Binary Data,这听起来可能很愚蠢,但却是现实生活中的一个例子:( 我能够显示带有“虚拟”链接名的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<

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

我能够显示带有“虚拟”链接名的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>
Xyz描述
Xyz描述
Xyz描述
此文档id表示数据库中的一个id(因为这些文档以字节[]的形式存储在blob中)

无论如何,我可以得到那个id,查询数据库并检索字节[](甚至可以将它存储在tmp文件中)

我不知道怎么做,当用户点击链接时(在我执行数据库检索之后),将字节[]提供给用户

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

那么,如何在jsp中提供存储在服务器文件系统中的字节数组的二进制内容呢

我的第一位客人是:

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

我接近解决方案了吗

这对客户机是否会起作用,就好像他真的在服务器上点击了一个真正的文件一样

提前谢谢。

像这样的

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中…希望这能有所帮助。

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

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

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

说到这一点,只需在JSP中编写与在a中相同的代码即可。实际上,您可以对其进行复制粘贴。只需确保您未将任何模板文本写入流,这包括在scriptlet之外的换行符和空白。其他明智的是,它也会被写入二进制文件并损坏它


如果您有多个scriptlet块,则需要对它们进行排列,以便在scriptlet的结尾
%>
和起始
之间没有换行符。请不要这样做

你在伤害你的用户

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

看一看类似的东西,然后仔细研究一下。是的,它是一个Servlet,而不是一个JSP,但这就是你想要成为一个好的HTTP公民所要做的


有些容器还有其他选项可以使用,你可以攻击Tomcats DefaultServlet等等。

你需要在响应中设置MIME类型,就像在我的示例中一样。是的……我假设了这一部分,感谢你的澄清。是的,我已经有了,实际上我正在使用:
application/vnd.ms excel
,但我真正的问题是这种方法有效吗?(使用response.out进行读写?)实际上,人们经常这样做是为了提供动态图像,其中您有一个类似于/foo/bar/yourmage.jsp的图像URL,它通过返回图像字节以及设置图像/gif或类似内容类型来动态提供图像。这不是对我问题的回答,而是一个注释,我知道这可能是achi如果你阅读了我的问题,这不是一个选项:(很抱歉,你的回答没有帮助)JSP是一个servlet,你几乎可以将99%的代码嵌入到你的JSP中,得到同样的结果;
清除输出,而不是弄乱页面格式。
<%@page import="java.io.InputStream" %><%
    //...
%>
<%@page import="java.io.InputStream" %>
<%
    //...
%>