Este artículo describe el método de lectura de Java, las imágenes de objetos BLOB de una base de datos y mostrarlas. Compártelo para su referencia. El método de implementación específico es el siguiente:
El primer método:
El método general es leer la transmisión Blob de la base de datos y escribirla en la página:
La copia del código es la siguiente: conexión conn = dbmanager.getConnection ();
Cadena sql = "Seleccione imagen del maestro donde id = 1";
Preparado PS = NULL;
ResultSet rs = null;
InputStream es = nulo;
OutputStream OS = NULL;
intentar {
ps = conn.preparestatement (SQL);
rs = ps.ExecuteQuery ();
if (rs.next ()) {
es = rs.getBinaryStream (1);
}
respuesta.setContentType ("Text/html");
OS = respuesta.getOutputStream ();
int num;
byte buf [] = nuevo byte [1024];
while ((num = is.read (buf))! =-1) {
OS.Write (buf, 0, num);
}
} Catch (SQLException e) {
E.PrintStackTrace ();
}
intentar {
is.close ();
os.close ();
rs.close ();
ps.close ();
} Catch (SQLException e) {
E.PrintStackTrace ();
}
En la página:
Copie el código de la siguiente manera: <%
String ruta = request.getContextPath ();
String basepath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerPort ()+ruta+"/";
%>
<img name = "pic" src = "<%= basepath+" servlet/downloadAstream "%>"/>
Hazlo.
El segundo método:
Todo el proceso se divide en cuatro pasos: conéctese a la base de datos Oracle -> Lea el campo de la imagen Blob -> Escalar la imagen -> Mostrar la imagen en la página JSP.
La copia del código es la siguiente: import java.sql.*;
import java.io.*;
import javax.imageio.imageio;
import java.awt.image.bufferedImage;
import java.awt.image.affinetransformop;
import java.awt.geom.affinetransform;
clase pública OracleQueryBean {
cadena final privada oracledrivername = "oracle.jdbc.driver.oracledriver";
Conexión privada myconnection = null;
cadena privada strtabname;
cadena privada stridName;
strimgname de cadena privada;
Public oracleQueryBean () {
intentar{
Class.forname (ORACLEDRIVERNAME);
} catch (classNotFoundException ex) {
System.out.println ("Error al cargar el controlador JDBC, Razón:" + Ex.getMessage ());
}
}
Public Connection getConnection () {
intentar{
// Nombre de usuario + contraseña;
// leer información de la base de datos del archivo de configuración
Getpara ogetpara = new getpara ();
String strip = ogetpara.getpara ("serverip");
Cadena strport = ogetpara.getpara ("puerto");
Cadena strdbname = ogetpara.getpara ("dbname");
String struser = ogetpara.getpara ("usuario");
String strpassword = oGetpara.getpara ("contraseña");
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 (Exception Ex) {
System.out.println ("No puede obtener conexión:" + Ex.getMessage ());
System.out.println ("Verifique si la información de la base de datos en el archivo de configuración es correcta");
}
devolver esto.myconnection;
}
}
2. Lea el campo Blob
Agregue una función a la clase OracleQueryBean para leer.
La copia del código es la siguiente: public byte [] getImgByteByid (String Strid, int w, int h) {
//System.out.println("get img data que ID es " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
intentar {
Declaración stmt = myconnection.createStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("Seleccione" + this.stridName + "de" + this.strtabname + "Where" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.Next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimgname);
InputStream IntileM = blob.getBinaryStream ();
intentar {
long nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("img El tamaño de los datos es: " + nsize);
data = new Byte [nsize];
Intileam.read (datos);
Intileam.close ();
} Catch (ioException e) {
System.out.println ("No se pudo obtener datos de imagen, razón:" + e.getMessage ());
}
data = ChangeImgSize (Data, W, H);
}
System.out.println (myStringBuffer.ToString ());
myconnection.commit ();
myconnection.close ();
} Catch (Sqlexception ex) {
System.out.println (ex.getMessage ());
}
devolver datos;
}
3. Zoom la imagen
Debido a que el tamaño de la imagen puede ser inconsistente, pero el tamaño de la salida en la página debe ser unificado, se debe agregar una función a la clase OracleQueryBean para escalar.
La copia del código es la siguiente: byte privado [] ChangeImgSize (byte [] data, int nw, int nh) {
byte [] newdata = null;
intentar{
BufferedImage bis = imageIO.Read (new byteArrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
doble sx = (doble) NW / W;
doble sy = (doble) nh / h;
Affinetransform Transform = new Affinetransform ();
transform.setroscala (SX, SY);
Affinetransformop Ato = new Affinetransformop (transformación, nulo);
// Color original
BufferedImage bid = new BufferedImage (NW, NH, BufferedImage.Type_3Byte_BGR);
ato.filter (bis, bid);
// Convertir a byte byte
BytearRayOutputStream Baos = new ByteArRayOutputStream ();
Imageio.write (bid, "jpeg", baos);
newdata = baos.tobytearray ();
} Catch (ioException e) {
E.PrintStackTrace ();
}
regresar NewData;
}
4. Muestra en la página de la página.
Copie el código de la siguiente manera: < %@ page idioma = "java" contentType = "text/html ;; charset = gbk" %>
<jsp: useBean id = "OrcleQuery" Scope = "Page" />
<%
respuesta.setContentType ("Image/jpeg");
// id de la imagen en la base de datos
Cadena strid = request.getParameter ("id");
// a miniatura o ampliar el ancho de la imagen
Cadena strwidth = request.getParameter ("W");
// a miniatura o ampliar la altura de la imagen
String strheight = request.getParameter ("H");
byte [] data = null;
if (strid! = null) {
int nWith = Integer.ParseInt (strWidth);
int nHeight = Integer.ParseInt (strheight);
// Obtener los datos de byte de la imagen
data = OrcleQuery.getImgByteById (Strid, NWith, nHeight);
ServLetOutputStream OP = Response.getOutputStream ();
op.write (datos, 0, data.length);
op.close ();
op = nulo;
respuesta.flushbuffer ();
// Borrar la secuencia de salida para evitar la captura de excepciones durante el lanzamiento
out.clear ();
out = pageContext.pushBody ();
}
%>
5. El código general de la clase de consultas de OracleQueryBean
El código de archivo oracleQueryBean.java es el siguiente:
La copia del código es la siguiente: import java.sql.*;
import java.io.*;
import javax.imageio.imageio;
import java.awt.image.bufferedImage;
import java.awt.image.affinetransformop;
import java.awt.geom.affinetransform;
clase pública OracleQueryBean {
cadena final privada oracledrivername = "oracle.jdbc.driver.oracledriver";
Conexión privada myconnection = null;
cadena privada strtabname;
cadena privada stridName;
strimgname de cadena privada;
Public oracleQueryBean () {
intentar{
Class.forname (ORACLEDRIVERNAME);
} catch (classNotFoundException ex) {
System.out.println ("Error al cargar el controlador JDBC, Razón:" + Ex.getMessage ());
}
}
Public Connection getConnection () {
intentar{
// Nombre de usuario + contraseña;
// leer información de la base de datos del archivo de configuración
Getpara ogetpara = new getpara ();
String strip = ogetpara.getpara ("serverip");
Cadena strport = ogetpara.getpara ("puerto");
Cadena strdbname = ogetpara.getpara ("dbname");
String struser = ogetpara.getpara ("usuario");
String strpassword = oGetpara.getpara ("contraseña");
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 (Exception Ex) {
System.out.println ("No puede obtener conexión:" + Ex.getMessage ());
System.out.println ("Verifique si la información de la base de datos en el archivo de configuración es correcta");
}
devolver esto.myconnection;
}
Public byte [] getImgByteById (String Strid, int w, int h) {
//System.out.println("get img data que ID es " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
intentar {
Declaración stmt = myconnection.createStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("Seleccione" + this.stridName + "de" + this.strtabname + "Where" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.Next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimgname);
InputStream IntileM = blob.getBinaryStream ();
intentar {
long nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("img El tamaño de los datos es: " + nsize);
data = new Byte [nsize];
Intileam.read (datos);
Intileam.close ();
} Catch (ioException e) {
System.out.println ("No se pudo obtener datos de imagen, razón:" + e.getMessage ());
}
data = ChangeImgSize (Data, W, H);
}
System.out.println (myStringBuffer.ToString ());
myconnection.commit ();
myconnection.close ();
} Catch (Sqlexception ex) {
System.out.println (ex.getMessage ());
}
devolver datos;
}
Public byte [] getimgbyteByid (string strid) {
//System.out.println("get img data que ID es " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
intentar {
Declaración stmt = myconnection.createStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("Seleccione" + this.stridName + "de" + this.strtabname + "Where" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.Next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimgname);
InputStream IntileM = blob.getBinaryStream ();
intentar {
long nlen = blob.length ();
int nsize = (int) nlen;
data = new Byte [nsize];
Intileam.read (datos);
Intileam.close ();
} Catch (ioException e) {
System.out.println ("No se pudo obtener datos de imagen, razón:" + e.getMessage ());
}
}
System.out.println (myStringBuffer.ToString ());
myconnection.commit ();
myconnection.close ();
} Catch (Sqlexception ex) {
System.out.println (ex.getMessage ());
}
devolver datos;
}
byte privado [] ChangeImgSize (byte [] data, int nw, int nh) {
byte [] newdata = null;
intentar{
BufferedImage bis = imageIO.Read (new byteArrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
doble sx = (doble) NW / W;
doble sy = (doble) nh / h;
Affinetransform Transform = new Affinetransform ();
transform.setroscala (SX, SY);
Affinetransformop Ato = new Affinetransformop (transformación, nulo);
// Color original
BufferedImage bid = new BufferedImage (NW, NH, BufferedImage.Type_3Byte_BGR);
ato.filter (bis, bid);
// Convertir a byte byte
BytearRayOutputStream Baos = new ByteArRayOutputStream ();
Imageio.write (bid, "jpeg", baos);
newdata = baos.tobytearray ();
} Catch (ioException e) {
E.PrintStackTrace ();
}
regresar NewData;
}
}
A continuación se muestra el código de copia de mi caso para almacenar imágenes de lectura de blob de la siguiente manera: import java.sql.*;
import java.io.*;
clase pública InsertPhoto {
public static void main (string [] args) lanza la excepción {
Class.forname ("com.mysql.jdbc.driver");
Connection Con = Drivermanager.getConnection ("JDBC: mysql: //127.0.0.1/wiseweb? User = root & Password = root");
Archivo f = nuevo archivo ("e: /123.jpg");
FileInputStream fis = new FileInputStream (f);
Cadena sql = "insertar en los valores de foto (foto, nombre de fotón) (?,?)";
Preparado PSTMT = Con.PrepareStatement (SQL);
pstmt.setBinaryStream (1, fis, (int) f.length ());
pstmt.setString (2, "imagen de prueba");
pstmt.executeUpdate ();
fis.close ();
pstmt.close ();
con.close ();
}
}
La copia del código es la siguiente: importar java.awt.image.bufferedImage;
import java.io.bufferedInputStream;
import java.io.ioException;
import java.io.inputstream;
import java.io.outputstream;
import java.sql.connection;
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.sqlexception;
import java.sql.statement;
import javax.imageio.imageio;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletRequest;
import javax.servlet.http.httpservletResponse;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegimageEncoder;
clase pública readphoto se extiende httpservlet {
Private static final Long SerialVersionUid = 1L;
Public void doget (httpservletRequest, respuesta httpservletResponse) {
if (request.getParameter ("id")! = null) {
respuesta.setContentType ("Image/jpeg");
intentar {
InputStream IS = QUERY_GETPHOTOIMAGEBLOB (Integer.ParseInt (request.getParameter ("id"))));
if (is! = null) {
es = nuevo bufferedInputStream (is);
BufferedImage bi = imageIO.read (is);
OutputStream OS = Response.getOutputStream ();
JpegimageEncoder coder = jpegcodec.createjpegencoder (OS);
encoder.encode (bi);
os.close ();
is.close ();
}
} Catch (ioException e) {
E.PrintStackTrace ();
} catch (numberFormateException e) {
// bloque de captura generado automático
E.PrintStackTrace ();
} catch (ClassNotFoundException e) {
// bloque de captura generado automático
E.PrintStackTrace ();
} Catch (SQLException e) {
// bloque de captura generado automático
E.PrintStackTrace ();
}
}
}
public static inputStream Query_getPhotoMageBlob (int id) Lanza ClassNotFoundException, SQLException {
Cadena sql = "Seleccione Photo de Photo Where id ="+id;
Conexión con = nulo;
Instrucción stmt = null;
ResultSet rs = null;
InputStream Result = NULL;
intentar {
Class.forname ("com.mysql.jdbc.driver");
con = drivermanager.getConnection ("jdbc: mysql: //127.0.0.1/wiseweb? user = root & contraseña = root");
stmt = con.createStatement ();
rs = stmt.executeQuery (sql);
if (rs.next ())
resultado = rs.getBlob ("Photo"). GetBinaryStream ();
} Catch (SQLException e) {
// TODO: Excepción de manejo
System.err.println (e.getMessage ());
} finalmente{
rs.close ();
stmt.close ();
con.close ();
}
resultado de retorno;
}
}
JSP muestra el código del código de copia de la siguiente manera: <img src = "<%= basepath%>/genimage? id = 3"/>
El código de copia está configurado en Web.xml de la siguiente manera: <Servlet>
<Servlet-Name> GenImage </servlet-name>
<servlet-class> readphoto </servlet-class>
</servlet>
<Servlet-mapping>
<Servlet-Name> GenImage </servlet-name>
<URL-Pattern>/GenImage </url-Pattern>
</Servlet-mapping>
Espero que este artículo sea útil para la programación Java de todos.