关于从数据库中读取文字信息和BLOB图片信息不能两全的问题+++求助!!!!! 数据库图片数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更正下第二段代码: try { ResultSet rs = t.search(sqll); while (rs.next()) { oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("MP_PICTURE"); inputimage = new BufferedInputStream(blob.getBinaryStream()); } } catch (Exception ex) { System.out.println("blobRead()'s exception"+ex); throw ex; } BufferedImage image = null; try{ image = ImageIO.read(inputimage); }catch(IOException e){ System.out.println(e); } ServletOutputStream sos = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos); encoder.encode(image); inputimage.close();问题还未解决,着急!! 在 Servlet 编程,你不能两次去 response 中拿 response.getOutputStream() 或 response.getWriter(),因为你拿了之后,服务器容器已经准备更新了一些 HTTP HEAD 参数了,你再去拿就有问题了,它不会再去更新了,正常的情况下我们第2次尝试时会得到 IllegalStateException / 500 错误,因此在你输出文字和图片之间你不能 close ()。就算我们程序从来不去 close 也不会出错,因为服务器知道什么时候 close,哪怕我们忘记了也没有关系,服务器在与客户端交互时知道 HTTP 协议的规范要求它怎么做。 具体应该怎么解决呢,只要把读取文字和读取图片之间的CLOSE去掉就行了么? 那个,我在读取文字的时候没有用到response啊,只是最后CLOSE了一个结果集,response只是用在了读取图片的时候,最后CLOSE了一个BufferedInputStream,一共用到这两个,如果删除上面的CLOSE,应该没什么影响啊,我把两个CLOSE都去掉了,结果还是一样,本应该没用RESPONSE显示的文字还是没有,只有显示的图片,那么文字到底哪里去了呢,我笨。。还望赐教 那个,我在读取文字的时候没有用到response啊,只是最后CLOSE了一个结果集,response只是用在了读取图片的时候,最后CLOSE了一个BufferedInputStream,一共用到这两个,如果删除上面的CLOSE,应该没什么影响啊,我把两个CLOSE都去掉了,结果还是一样,本应该没用RESPONSE显示的文字还是没有,只有显示的图片,那么文字到底哪里去了呢,我笨。。还望赐教PS:图片和文字分别在两张表里 看了一下你的 JSP 为什么直接写图片的二进制字节,你的 <image ... > 这些东西哪儿去了?平时一个 html 中会是 <image src="http://.../abc.jpg" /> 这样的写法。你在浏览器中看到收到服务器的东西是什么样的?如果你需要直接把图片内容嵌入在浏览器的 html 中需要像这样:<image src="data:image/jpg;base64,iVBORw0KGgoAAAANSUhEU...gAAASwAAAAmCC" />把你的二进制内容先编码成 base64 纯文本,贴在后面。 我没有用IMG,我看到的是直接左上角一张图片。 你先了解怎么写一个正确的 html 网页。以及一个网页显示出来时浏览器与服务器之间做了哪些事。正确的网页大概是:<html><body> <!-- 你的文字内容在这里 --> <img src="data:image/jpg;basr64; iVBORw0KGgoAAAANSUhEU...gAAASwAAAAmCC" /></body></html>要想一个 request 就把文字和图片都返回给客户端只能这样做,否则你需要2个 request 来做,这个 ./loadData.jsp?getPicture=1234 将导致浏览器再发送第2个 request 去服务器,这次只拿图片:<html><body> <!-- 你的文字内容在这里 --> <img src="./loadData.jsp?getPicture=1234" /></body></html> AJAX 这句错那了? 关于java处理换行符的问题,在线等 字符转换小问题 jspsmartupload.jar上传文件,如何限制上传文件的大小,如果超出限制,如何弹出提示? hibernate配置问题 jexcelapi的问题 jsp编译错误~~~~求助~ 数据插入问题 在线等待,解决给分。一个棘手问题 jtds-1.2.jar做为jdbc驱动,当statement中设置的maxRow是怎么实现的 java web snmp协议远程电源管理开发的思路
try { ResultSet rs = t.search(sqll); while (rs.next()) {
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("MP_PICTURE");
inputimage = new BufferedInputStream(blob.getBinaryStream());
}
} catch (Exception ex) {
System.out.println("blobRead()'s exception"+ex);
throw ex;
}
BufferedImage image = null;
try{
image = ImageIO.read(inputimage);
}catch(IOException e){
System.out.println(e);
}
ServletOutputStream sos = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);
encoder.encode(image);
inputimage.close();
问题还未解决,着急!!
因为你拿了之后,服务器容器已经准备更新了一些 HTTP HEAD 参数了,你再去拿就有问题了,它不会再去更新了,正常的情况下我们第2次尝试时会得到 IllegalStateException / 500 错误,因此在你输出文字和图片之间你不能 close ()。就算我们程序从来不去 close 也不会出错,因为服务器知道什么时候 close,哪怕我们忘记了也没有关系,服务器在与客户端交互时知道 HTTP 协议的规范要求它怎么做。
具体应该怎么解决呢,只要把读取文字和读取图片之间的CLOSE去掉就行了么?
那个,我在读取文字的时候没有用到response啊,只是最后CLOSE了一个结果集,response只是用在了读取图片的时候,最后CLOSE了一个BufferedInputStream,一共用到这两个,如果删除上面的CLOSE,应该没什么影响啊,我把两个CLOSE都去掉了,结果还是一样,本应该没用RESPONSE显示的文字还是没有,只有显示的图片,那么文字到底哪里去了呢,我笨。。还望赐教
那个,我在读取文字的时候没有用到response啊,只是最后CLOSE了一个结果集,response只是用在了读取图片的时候,最后CLOSE了一个BufferedInputStream,一共用到这两个,如果删除上面的CLOSE,应该没什么影响啊,我把两个CLOSE都去掉了,结果还是一样,本应该没用RESPONSE显示的文字还是没有,只有显示的图片,那么文字到底哪里去了呢,我笨。。还望赐教PS:图片和文字分别在两张表里
<image src="data:image/jpg;base64,iVBORw0KGgoAAAANSUhEU...gAAASwAAAAmCC" />
把你的二进制内容先编码成 base64 纯文本,贴在后面。
我没有用IMG,我看到的是直接左上角一张图片。
以及一个网页显示出来时浏览器与服务器之间做了哪些事。
正确的网页大概是:<html>
<body>
<!-- 你的文字内容在这里 --> <img src="data:image/jpg;basr64; iVBORw0KGgoAAAANSUhEU...gAAASwAAAAmCC" />
</body>
</html>
要想一个 request 就把文字和图片都返回给客户端只能这样做,否则你需要2个 request 来做,这个 ./loadData.jsp?getPicture=1234 将导致浏览器再发送第2个 request 去服务器,这次只拿图片:
<html>
<body>
<!-- 你的文字内容在这里 -->
<img src="./loadData.jsp?getPicture=1234" />
</body>
</html>