Java 如何使用JSP提供文件服务?
这听起来可能很愚蠢,但却是现实生活中的一个例子:( 我能够显示带有“虚拟”链接名的HTML表 大概是这样的: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<
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" %>
<%
//...
%>