当前位置: 技术问答>java相关
高分求救:java显示blob图象
来源: 互联网 发布时间:2017-04-26
本文导语: try{ String strSQL="select PHOTO_ORIG from EXC_GETBACK_CONTECT where "+ "REQUIRE_ID='"+strSEQ+"' and ACK_ID='"+strData[0]+"' and "+"CITIZEN_ID='"+strData[1]+"' and NAME='"+strData[2]+"' "; PreparedStatement stmt = dbConn.prepareCall(strSQL); ResultSet rs=stmt.e...
try{
String strSQL="select PHOTO_ORIG from EXC_GETBACK_CONTECT where "+
"REQUIRE_ID='"+strSEQ+"' and ACK_ID='"+strData[0]+"' and "+"CITIZEN_ID='"+strData[1]+"' and NAME='"+strData[2]+"' ";
PreparedStatement stmt = dbConn.prepareCall(strSQL);
ResultSet rs=stmt.executeQuery();
while (rs.next()){
Blob blob = rs.getBlob("PHOTO_ORIG");
byte[] b = blob.getBytes(1,(int)(blob.length()));
ImageIcon image=new ImageIcon(b);
lblPIC.setIcon(image);
}
rs.close();
stmt.close();
}
catch(Exception ex){}
我是这样从oracle里读数据的。可是如果图片是小的gif文件,就可以顺利的读出来,换成jpg就不可以。用system.out.println(image)可以打印出读jpg文件时的一些类似二进制的数据。
如果我把从数据库里读出的blob (jpg)文件写到文件里,这个图片文件就是正常的了。我们现在这个项目要在java图形界面写把这个图片显示出来。
请多多指教。帮忙。
如果分不够,我还可以多给,要多少分都可以。
String strSQL="select PHOTO_ORIG from EXC_GETBACK_CONTECT where "+
"REQUIRE_ID='"+strSEQ+"' and ACK_ID='"+strData[0]+"' and "+"CITIZEN_ID='"+strData[1]+"' and NAME='"+strData[2]+"' ";
PreparedStatement stmt = dbConn.prepareCall(strSQL);
ResultSet rs=stmt.executeQuery();
while (rs.next()){
Blob blob = rs.getBlob("PHOTO_ORIG");
byte[] b = blob.getBytes(1,(int)(blob.length()));
ImageIcon image=new ImageIcon(b);
lblPIC.setIcon(image);
}
rs.close();
stmt.close();
}
catch(Exception ex){}
我是这样从oracle里读数据的。可是如果图片是小的gif文件,就可以顺利的读出来,换成jpg就不可以。用system.out.println(image)可以打印出读jpg文件时的一些类似二进制的数据。
如果我把从数据库里读出的blob (jpg)文件写到文件里,这个图片文件就是正常的了。我们现在这个项目要在java图形界面写把这个图片显示出来。
请多多指教。帮忙。
如果分不够,我还可以多给,要多少分都可以。
|
从数据库中读取并生成图片的Servlet
(文/邵望)
大体思路
1)创建ServletOutputStream对象out,用于以字节流的方式输出图像
2)查询数据库,用getBinaryStream方法返回InputStream对象in
3)创建byte数组用作缓冲,将in读入buf[],再由out输出
注:下面的例程中数据库连接用了ConnectionPool,以及参数的获得进行了预处理
package net.seasky.music;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import net.seasky.util.*;
import net.seasky.database.DbConnectionManager;
public class CoverServlet extends HttpServlet {
private static final String CONTENT_TYPE = "image/gif";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response
) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
int albumID;
ServletOutputStream out = response.getOutputStream();
try {
albumID = ParamManager.getIntParameter(request,"albumID",0);
}
catch (Exception e) {
response.sendRedirect("../ErroePage.jsp");
return;
}
try {
InputStream in=this.getCover(albumID);
int len;
byte buf[]=new byte[1024];
while ((len=in.read(buf,0,1024))!=-1) {
out.write(buf,0,len);
}
}
catch (IOException ioe) {
ioe.printStackTrace() ;
}
}
private InputStream getCover(int albumID) {
InputStream in=null;
Connection cn = null;
PreparedStatement pst = null;
try {
cn=DbConnectionManager.getConnection();
cn.setCatalog("music");
pst=cn.prepareStatement("SELECT img FROM cover where ID =?");
pst.setInt(1,albumID);
ResultSet rs=pst.executeQuery();
rs.next() ;
in=rs.getBinaryStream("img");
}
catch (SQLException sqle) {
System.err.println("Error in CoverServlet : getCover()-" + sqle);
sqle.printStackTrace() ;
}
finally {
try {
pst.close() ;
cn.close() ;
}
catch (Exception e) {
e.printStackTrace();
}
}
return in;
}
public void destroy() {
}
}
附:
http://www.code-labs.com/project/projectinfo.php?id=44
http://www.yesky.com/20000927/118356.shtml
(文/邵望)
大体思路
1)创建ServletOutputStream对象out,用于以字节流的方式输出图像
2)查询数据库,用getBinaryStream方法返回InputStream对象in
3)创建byte数组用作缓冲,将in读入buf[],再由out输出
注:下面的例程中数据库连接用了ConnectionPool,以及参数的获得进行了预处理
package net.seasky.music;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import net.seasky.util.*;
import net.seasky.database.DbConnectionManager;
public class CoverServlet extends HttpServlet {
private static final String CONTENT_TYPE = "image/gif";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response
) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
int albumID;
ServletOutputStream out = response.getOutputStream();
try {
albumID = ParamManager.getIntParameter(request,"albumID",0);
}
catch (Exception e) {
response.sendRedirect("../ErroePage.jsp");
return;
}
try {
InputStream in=this.getCover(albumID);
int len;
byte buf[]=new byte[1024];
while ((len=in.read(buf,0,1024))!=-1) {
out.write(buf,0,len);
}
}
catch (IOException ioe) {
ioe.printStackTrace() ;
}
}
private InputStream getCover(int albumID) {
InputStream in=null;
Connection cn = null;
PreparedStatement pst = null;
try {
cn=DbConnectionManager.getConnection();
cn.setCatalog("music");
pst=cn.prepareStatement("SELECT img FROM cover where ID =?");
pst.setInt(1,albumID);
ResultSet rs=pst.executeQuery();
rs.next() ;
in=rs.getBinaryStream("img");
}
catch (SQLException sqle) {
System.err.println("Error in CoverServlet : getCover()-" + sqle);
sqle.printStackTrace() ;
}
finally {
try {
pst.close() ;
cn.close() ;
}
catch (Exception e) {
e.printStackTrace();
}
}
return in;
}
public void destroy() {
}
}
附:
http://www.code-labs.com/project/projectinfo.php?id=44
http://www.yesky.com/20000927/118356.shtml
|
你把写到文件后的那个文件(out.jpg)与你写进去的文件比较一下,看看大小、内容是否一样。如果不一样,说明写入程序可能有问题。
如果你愿意,可以试着将你的读和写的源程序发给我,我也许能帮你查查。
我的电子邮件是里littlebird800225@hotmail.com
如果你愿意,可以试着将你的读和写的源程序发给我,我也许能帮你查查。
我的电子邮件是里littlebird800225@hotmail.com
|
只要能保证blob的数据正确,那生成的文件扩展名不会有影响的.
ImageIcon是支持gif和jpeg的。
>>>>>>>>
现在的问题是,读非常小的GIF就可以显示出来,而JPG不行。
那么大一些的gif能正常显示吗?
JLabel lblTest = new JLabel("test");
Image img = Toolkit.getDefaultToolkit().getImage("d:/top.jpg");
ImageIcon icon = new ImageIcon(img);
lblTest.setIcon(icon);
我试了一下,不管是jpg,还是gif都没有问题,也和文件大小无关
你试一试用RandomAccessFile来生成jpg文件
也许问题是出在
byte[] b = blob.getBytes(1,(int)(blob.length()));
这里,b的数据不完全正确
ImageIcon是支持gif和jpeg的。
>>>>>>>>
现在的问题是,读非常小的GIF就可以显示出来,而JPG不行。
那么大一些的gif能正常显示吗?
JLabel lblTest = new JLabel("test");
Image img = Toolkit.getDefaultToolkit().getImage("d:/top.jpg");
ImageIcon icon = new ImageIcon(img);
lblTest.setIcon(icon);
我试了一下,不管是jpg,还是gif都没有问题,也和文件大小无关
你试一试用RandomAccessFile来生成jpg文件
也许问题是出在
byte[] b = blob.getBytes(1,(int)(blob.length()));
这里,b的数据不完全正确
|
xiaofenguser(风雨)强调的是个流的操作,建议楼主区blob使用oracle提供的BLOB来进行操作。BLOB也提供流的操作。
|
应该是不能显示的啊,你写入的是GIF,但是写到的确实JPG文件,格式不一样的。你用uedit打开你写的JPG文件,看看是不是FF D8开头,FF D9结尾!
另外GUI程序没怎么写过,不过我觉得xiaofenguser(风雨)强调的是个流的操作应该可以的!
另外GUI程序没怎么写过,不过我觉得xiaofenguser(风雨)强调的是个流的操作应该可以的!
|
up