Este artigo descreve o método do Java Reading Blob Object Pictures de um banco de dados e exibi -las. Compartilhe para sua referência. O método de implementação específico é o seguinte:
O primeiro método:
O método geral é ler o fluxo do BLOB do banco de dados e escrevê -lo na página:
A cópia do código é a seguinte: conexão conn = dbManager.getConnection ();
String sql = "Selecione a imagem do professor onde id = 1";
Preparado estatement ps = null;
ResultSet rs = null;
InputStream é = nulo;
OutputStream OS = NULL;
tentar {
ps = Conn.Preparestatement (SQL);
rs = ps.executeQuery ();
if (rs.Next ()) {
é = rs.getBinarystream (1);
}
Response.setContentType ("Text/html");
OS = Response.getOutputStream ();
int num;
byte buf [] = novo byte [1024];
while ((num = is.read (buf))! =-1) {
OS.WRITE (BUF, 0, NUM);
}
} catch (sqlexception e) {
E.PrintStackTrace ();
}
tentar {
is.close ();
os.close ();
rs.close ();
ps.close ();
} catch (sqlexception e) {
E.PrintStackTrace ();
}
Na página:
Copie o código da seguinte forma: <%
String path = request.getContextPath ();
String basalepath = request.getScheme ()+": //"+request.getServername ()+":"+request.getServerport ()+path+"/";
%>
<img name = "pic" src = "<%= baseepath+" servlet/downloadasstream "%>"/>
Faça isso.
O segundo método:
Todo o processo é dividido em quatro etapas: conecte -se ao banco de dados Oracle -> leia o campo da imagem do blob -> escalando a imagem -> exibindo a imagem na página JSP.
A cópia do código é a seguinte: importar java.sql.*;
importar java.io.*;
importar javax.imageio.imageio;
importar java.awt.image.bufferiMage;
importar java.awt.image.affineTransformOp;
importar java.awt.geom.affineTransform;
classe pública OracleQueryBean {
String final privada oracledrivername = "oracle.jdbc.driver.oracledriver";
conexão privada myConnection = null;
string privada strtabname;
StridName de string privado;
String privada Strimgname;
public OracleQueryBean () {
tentar{
Class.ForName (Oracledrivername);
} catch (classNotFoundException Ex) {
System.out.println ("Falha ao carregar o driver JDBC, Razão:" + Ex.getMessage ());
}
}
Public Connection getConnection () {
tentar{
// nome de usuário + senha;
// Leia as informações do banco de dados do arquivo de configuração
GetPara ogetpara = new getPara ();
String tira = ogetpara.getpara ("serverip");
String strport = ogetpara.getpara ("porta");
String strdbname = ogetpara.getpara ("dbname");
String struser = ogetpara.getpara ("usuário");
String strpassword = ogetpara.getpara ("senha");
this.strtabname = ogetpara.getpara ("tableName");
this.stridname = ogetpara.getpara ("imgidname");
this.strimgname = ogetpara.getpara ("imgname");
String oracleurlToconnect = "JDBC: Oracle: Thin:@"+Strip+":"+strport+":"+strdbname;
this.myConnection = driverManager.getConnection (oracleurltoconnect, struser, strpassword);
} catch (Exceção ex) {
System.out.println ("Não pode obter conexão:" + ex.getMessage ());
System.out.println ("Verifique se as informações do banco de dados no arquivo de configuração estão corretas.");
}
retornar esta.myConnection;
}
}
2. Leia o campo BLOB
Adicione uma função à classe OracleQueryBean para ler.
A cópia do código é a seguinte: public byte [] getImgbytebyId (String strid, int w, int h) {
//System.out.println("get dados img qual id é " + nid);
if (myConnection == null)
this.getConnection ();
byte [] dados = nulo;
tentar {
Instrução stmt = myConnection.createstatement ();
ResultSet myResultSet = stmt.executeQuery ("selecione" + this.stridname + "de" + this.strtabname + "onde" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultset.Next ()) {
java.sql.blob blob = myResultset.getblob (this.strimgname);
InputStream InstrtEam = BLOB.GetBinaryStream ();
tentar {
longo nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("IMG Tamanho dos dados é: " + nsize);
dados = novo byte [nsize];
Instream.read (dados);
Instruam.close ();
} catch (ioexception e) {
System.out.println ("Falha ao obter dados de imagem, razão:" + e.getMessage ());
}
dados = alterarimgSize (dados, w, h);
}
System.out.println (myStringbuffer.toString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retornar dados;
}
3. Zoom a imagem
Como o tamanho da imagem pode ser inconsistente, mas o tamanho da saída na página precisa ser unificado, uma função precisa ser adicionada à classe OracleQueryBean para escalar.
A cópia do código é a seguinte: Byte privado [] ChangeImgSize (Byte [] Data, int nw, int nh) {
byte [] newData = null;
tentar{
BufferImage bis = imageio.read (new ByteArrayInputStream (dados));
int w = bis.getWidth ();
int h = bis.getHeight ();
duplo sx = (duplo) nw / w;
duplo sy = (duplo) nh / h;
AffineTransform Transform = new AffineTransform ();
transform.settoscale (SX, SY);
AffineTransformOp Ato = New AffineTransformOp (Transform, NULL);
// cor original
BUBLEREDIMAGE BID = new BufferImage (NW, NH, BufferImage.Type_3Byte_BGR);
Ato.Filter (bis, bid);
// converter em byte byte
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
Imageio.write (BID, "JPEG", BAOS);
newData = baos.tobytearray ();
} catch (ioexception e) {
E.PrintStackTrace ();
}
retornar newData;
}
4. Exibir na página da página.
Copie o código da seguinte forma: < %@ página de página = "java" contentType = "text/html;
<jsp: usebean id = "orcleQuery" scope = "page" />
<%
Response.setContentType ("Image/jpeg");
// ID da imagem no banco de dados
String strid = request.getParameter ("id");
// para miniatura ou ampliar a largura da imagem
String strwidth = request.getParameter ("w");
// para miniatura ou ampliar a altura da imagem
String strety = request.getParameter ("h");
byte [] dados = nulo;
if (strid! = null) {
int nwith = Integer.parseint (strwidth);
int nheight = Integer.parseint (forte);
// Obtenha os dados de byte da imagem
dados = orcleQuery.getImgbytebyId (strid, nwith, nheight);
ServletOutputStream op = Response.getOutputStream ();
op.write (dados, 0, data.length);
op.close ();
op = null;
Response.flushBuffer ();
// limpe o fluxo de saída para impedir a captura de exceções durante a liberação
out.clear ();
out = PageContext.pushbody ();
}
%>
5. O código geral da aula de consulta OracleQueryBean
O código de arquivo OracleQueryBean.java é o seguinte:
A cópia do código é a seguinte: importar java.sql.*;
importar java.io.*;
importar javax.imageio.imageio;
importar java.awt.image.bufferiMage;
importar java.awt.image.affineTransformOp;
importar java.awt.geom.affineTransform;
classe pública OracleQueryBean {
String final privada oracledrivername = "oracle.jdbc.driver.oracledriver";
conexão privada myConnection = null;
string privada strtabname;
StridName de string privado;
String privada Strimgname;
public OracleQueryBean () {
tentar{
Class.ForName (Oracledrivername);
} catch (classNotFoundException Ex) {
System.out.println ("Falha ao carregar o driver JDBC, Razão:" + Ex.getMessage ());
}
}
Public Connection getConnection () {
tentar{
// nome de usuário + senha;
// Leia as informações do banco de dados do arquivo de configuração
GetPara ogetpara = new getPara ();
String tira = ogetpara.getpara ("serverip");
String strport = ogetpara.getpara ("porta");
String strdbname = ogetpara.getpara ("dbname");
String struser = ogetpara.getpara ("usuário");
String strpassword = ogetpara.getpara ("senha");
this.strtabname = ogetpara.getpara ("tableName");
this.stridname = ogetpara.getpara ("imgidname");
this.strimgname = ogetpara.getpara ("imgname");
String oracleurlToconnect = "JDBC: Oracle: Thin:@"+Strip+":"+strport+":"+strdbname;
this.myConnection = driverManager.getConnection (oracleurltoconnect, struser, strpassword);
} catch (Exceção ex) {
System.out.println ("Não pode obter conexão:" + ex.getMessage ());
System.out.println ("Verifique se as informações do banco de dados no arquivo de configuração estão corretas.");
}
retornar esta.myConnection;
}
public byte [] getimgbytebyId (Strid strid, int w, int h) {
//System.out.println("get dados img qual id é " + nid);
if (myConnection == null)
this.getConnection ();
byte [] dados = nulo;
tentar {
Instrução stmt = myConnection.createstatement ();
ResultSet myResultSet = stmt.executeQuery ("selecione" + this.stridname + "de" + this.strtabname + "onde" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultset.Next ()) {
java.sql.blob blob = myResultset.getblob (this.strimgname);
InputStream InstrtEam = BLOB.GetBinaryStream ();
tentar {
longo nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("IMG Tamanho dos dados é: " + nsize);
dados = novo byte [nsize];
Instream.read (dados);
Instruam.close ();
} catch (ioexception e) {
System.out.println ("Falha ao obter dados de imagem, razão:" + e.getMessage ());
}
dados = alterarimgSize (dados, w, h);
}
System.out.println (myStringbuffer.toString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retornar dados;
}
public byte [] getimgbytebyId (strid strid) {
//System.out.println("get dados img qual id é " + nid);
if (myConnection == null)
this.getConnection ();
byte [] dados = nulo;
tentar {
Instrução stmt = myConnection.createstatement ();
ResultSet myResultSet = stmt.executeQuery ("selecione" + this.stridname + "de" + this.strtabname + "onde" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultset.Next ()) {
java.sql.blob blob = myResultset.getblob (this.strimgname);
InputStream InstrtEam = BLOB.GetBinaryStream ();
tentar {
longo nlen = blob.length ();
int nsize = (int) nlen;
dados = novo byte [nsize];
Instream.read (dados);
Instruam.close ();
} catch (ioexception e) {
System.out.println ("Falha ao obter dados de imagem, razão:" + e.getMessage ());
}
}
System.out.println (myStringbuffer.toString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retornar dados;
}
byte privado [] changeImgSize (byte [] dados, int nw, int nh) {
byte [] newData = null;
tentar{
BufferImage bis = imageio.read (new ByteArrayInputStream (dados));
int w = bis.getWidth ();
int h = bis.getHeight ();
duplo sx = (duplo) nw / w;
duplo sy = (duplo) nh / h;
AffineTransform Transform = new AffineTransform ();
transform.settoscale (SX, SY);
AffineTransformOp Ato = New AffineTransformOp (Transform, NULL);
// cor original
BUBLEREDIMAGE BID = new BufferImage (NW, NH, BufferImage.Type_3Byte_BGR);
Ato.Filter (bis, bid);
// converter em byte byte
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
Imageio.write (BID, "JPEG", BAOS);
newData = baos.tobytearray ();
} catch (ioexception e) {
E.PrintStackTrace ();
}
retornar newData;
}
}
Abaixo está o meu código de cópia de caso para armazenar imagens de leitura do blob da seguinte forma: importar java.sql.*;
importar java.io.*;
classe pública insertphoto {
public static void main (string [] args) lança exceção {
Class.ForName ("com.mysql.jdbc.driver");
Conexão con = driverManager.getConnection ("jdbc: mysql: //127.0.0.1/wiseweb? User = root & senha = root");
Arquivo f = novo arquivo ("e: /123.jpg");
FileInputStream fis = new FileInputStream (f);
String sql = "inserir na foto (foto, fotoname) valores (?,?)";
Preparado PSTMT = Con.Preparestatement (SQL);
pstmt.setBinarystream (1, fis, (int) f.Length ());
Pstmt.SetString (2, "Imagem de teste");
pstmt.executeUpdate ();
fis.close ();
pstmt.close ();
con.close ();
}
}
A cópia do código é a seguinte: importar java.awt.image.bufferiMage;
importar java.io.bufferInputStream;
importar java.io.ioException;
importar java.io.inputStream;
importar java.io.OutputStream;
importar java.sql.connection;
importar java.SQL.DriverManager;
importar java.sql.resultset;
importar java.sql.sqLexception;
importar java.sql.statement;
importar javax.imageio.imageio;
importar javax.servlet.http.httpServlet;
importar javax.servlet.http.httpServletRequest;
importar javax.servlet.http.httpServletResponse;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegImageEncoder;
classe pública Readphoto estende HttpServlet {
private estático final serialversionUid = 1L;
Public void Doget (solicitação httpServletRequest, httpServletResponse Response) {
if (request.getParameter ("id")! = null) {
Response.setContentType ("Image/jpeg");
tentar {
InputStream is = query_getphotoimageBlob (Integer.parseint (request.getParameter ("id"))));
se (é! = null) {
é = new bufferInputStream (IS);
BufferImage bi = imageio.read (IS);
OutputStream OS = Response.getOutputStream ();
JpegImageEncoder coder = jpegCodec.createjpegencoder (OS);
coder.Encode (BI);
os.close ();
is.close ();
}
} catch (ioexception e) {
E.PrintStackTrace ();
} catch (numberFormatexception e) {
// TODO BLOCO DE CAPAGEM AUTOMAGEM
E.PrintStackTrace ();
} catch (classNotfoundException e) {
// TODO BLOCO DE CAPAGEM AUTOMAGEM
E.PrintStackTrace ();
} catch (sqlexception e) {
// TODO BLOCO DE CAPAGEM AUTOMAGEM
E.PrintStackTrace ();
}
}
}
public static inputStream query_getphotoimageblob (int id) lança ClassNotFoundException, SQLEXCECCEIRA {
String sql = "Selecione foto da foto onde id ="+id;
Conexão con = null;
Instrução stmt = null;
ResultSet rs = null;
INPUTSTREAM RESULT = NULL;
tentar {
Class.ForName ("com.mysql.jdbc.driver");
con = driverManager.getConnection ("jdbc: mysql: //127.0.0.1/wiseweb? user = root & senha = root");
stmt = con.createstatement ();
rs = stmt.executeQuery (SQL);
if (rs.Next ())
resultado = rs.getblob ("foto"). getBinaryStream ();
} catch (sqlexception e) {
// TODO: lidar com a exceção
System.err.println (e.getMessage ());
} finalmente{
rs.close ();
stmt.close ();
con.close ();
}
resultado de retorno;
}
}
JSP exibe o código de cópia da seguinte forma: <img src = "<%= bashepath%>/genimage? id = 3"/>
O código de cópia está configurado em web.xml da seguinte forma: <Verlet>
<ame-name> genimage </vletname>
<Verlet-Class> readphoto </vlett-Class>
</servlet>
<Servlet-Mapping>
<ame-name> genimage </vletname>
<url-padrão>/genimage </url-padrão>
</servlet-mapping>
Espero que este artigo seja útil para a programação Java de todos.