我不在单位,所以没法帖程序。
大致思路是,用SERVLET
select到一个resultset中,然后用rs.getBinaryStream取得流,然后对这个Stream 作read,而且最好是循环读,直到return -1;表示读完了流,这样得到一个字节(byte)数组,再对respond设置contentType为image/*,然后把字节数组写到respond中,即可。
然后用JSP调此SERVLET,结束。
如有兴趣,星期一贴程序。
大致思路是,用SERVLET
select到一个resultset中,然后用rs.getBinaryStream取得流,然后对这个Stream 作read,而且最好是循环读,直到return -1;表示读完了流,这样得到一个字节(byte)数组,再对respond设置contentType为image/*,然后把字节数组写到respond中,即可。
然后用JSP调此SERVLET,结束。
如有兴趣,星期一贴程序。
解决方案 »
- 求oracle SQL修改多行记录
- 请教oracle数据库优化,尽量分详细点
- 拜求一条sql--可糅合现有的两条sql
- 请教:ORACLE9I数据表中不显示中文,而变成问号,什么原因????
- 100分求助一查询问题(做报表时遇到的问题)
- 小妹正在学习oracle10g,请高手指点一下.
- oracle的日期问题?
- PL/SQL两个日期类型直接比较的问题。
- 优化PL/SQL...............
- 正在连接...ORA-12541: TNS:no listener 测试未成功。
- 如何建立建立一个数据库(我的是在redhat7.2下的oracle8.17数据库),能不能给个例子
- 在线等待 在 Enterprise Manager 中无法显示数据库,为什么?
我期待你的程序,谢谢!
急,请帮忙!
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;public class Servlet1 extends HttpServlet {
static final private String CONTENT_TYPE = "image/jpeg"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
OutputStream out = response.getOutputStream();
FileInputStream fis = new FileInputStream("e:\\aaa.jpg");
int b = fis.read();
while(b!=-1){
out.write(b);
b = fis.read(); }
fis.close();
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws javax.servlet.ServletException, java.io.IOException {
doGet(req,resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws javax.servlet.ServletException, java.io.IOException {
doGet(req,resp);
}
}
int b = fis.read();
while(b!=-1){
out.write(b);
b = fis.read(); }
fis.flush();//最好有这步
fis.close();
只不过fis是数据库中getBinaryStream得来的,明天确认
String sql = "select picture from tmp_pic where id=1"; Statement stmt = null; ResultSet rs = null; try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
System.out.println(e);
} try { if (rs.next()) { res.setContentType("image/*");
ServletOutputStream sout = res.getOutputStream();
/*
//互联网应用时,如果图片较大(>1M),且网速较低,可以考虑使用以下方式
//效果,使JPG从上到下分为数分,慢慢展示,类似ACDSEE
int BUFFER_SIZE=200000;
InputStream in = rs.getBinaryStream(1); byte b[] = new byte[BUFFER_SIZE];
for (int i = in.read(b,0,BUFFER_SIZE); i!=-1;) {
System.out.println("Read "+i+" bytes.");
sout.write(b,0,i);
i=in.read(b,0,BUFFER_SIZE);
}
*/
/*下面两行是我用的简单的调用方式,目前没有发现问题,而且效率高,如果不喜欢,可用上面注释的部分代替下面两行代码即可。*/
byte [] image =rs.getBytes(1);
sout.write(image);
sout.flush();
sout.close();
}
} catch (Exception e) {
System.out.println(e); PrintWriter toClient = res.getWriter(); //得到向客户端输出文本的对象
res.setContentType("text/html;charset=gb2312");
toClient.write("无法打开图片!");
toClient.close();
} finally {
stmt.close();
conn.close();
}
我想给你们都加分。
谢谢!
按照你的方法,我已成功地把数据库表的blob字段的JPEG图像给显示出来。
可是,当我用同样的方法去显示存在blob中的word文档时,却显示乱码,
且乱码下边还有错误提示:
Internal Servlet Error:
java.lang.IllegalStateException: getOutputStream() has already been called我试着把response.setContentType("image/*");改为
response.setContentType("text/html;charset=gb2312");
response.setContentType("text/*;charset=gb2312");还是一样
能告诉我如何解决吗,谢谢!