Dieser Artikel beschreibt die Methode des Java -Lesens von Blob -Objektbildern aus einer Datenbank und der Anzeige. Teilen Sie es für Ihre Referenz. Die spezifische Implementierungsmethode lautet wie folgt:
Die erste Methode:
Die allgemeine Methode besteht darin, den Blob -Stream aus der Datenbank vorzulesen und auf die Seite zu schreiben:
Die Codekopie lautet wie folgt: Verbindung conn = dbmanager.getConnection ();
String SQL = "Bild vom Lehrer auswählen, wobei ID = 1";
PrepedStatement ps = null;
ResultSet rs = null;
InputStream ist = null;
OutputStream os = null;
versuchen {
ps = conn.preparestatement (SQL);
rs = ps.executeQuery ();
if (rs.Next ()) {
ist = rs.getBinarystream (1);
}
response.setContentType ("text/html");
os = response.getOutputStream ();
int num;
Byte buf [] = neues Byte [1024];
while ((num = is.read (buf))! =-1) {
os.write (buf, 0, num);
}
} catch (sqlexception e) {
E. printstacktrace ();
}
versuchen {
IS.CLOSE ();
os.close ();
rs.close ();
ps.close ();
} catch (sqlexception e) {
E. printstacktrace ();
}
In der Seite:
Kopieren Sie den Code wie folgt: <%
String path = request.getContextPath ();
String basepath = request.getScheme ()+": //"+request.getSerVername ()+":"+request.getServerport ()+path+"/";
%>
<img name = "pic" src = "<%= Basepath+" Servlet/DownloadAsTream "%>"/>
Erledigen.
Die zweite Methode:
Der gesamte Vorgang ist in vier Schritte unterteilt: Stellen Sie eine Verbindung zur Oracle -Datenbank her -> Lesen Sie das BLOB -Bildfeld -> Skalieren des Bildes -> Das Bild auf der JSP -Seite anzeigen.
Die Codekopie lautet wie folgt: Importieren Sie Java.sql.*;
import Java.io.*;
import Javax.imageo.imageo;
Import Java.awt.image.BuffenedImage;
import Java.awt.image.Affinetransformop;
import Java.awt.geom.Affinetransform;
Öffentliche Klasse OracleQuerybean {
private endgültige String oracledRivername = "oracle.jdbc.driver.oracledriver";
private Verbindung myConnection = null;
private String Strtabname;
private String -Stridname;
private String Strimgname;
public OracleQuerybean () {
versuchen{
Class.ForName (oracledRivername);
} catch (classNotFoundException ex) {
System.out.println ("JDBC -Treiber nicht geladen, Grund:" + ex.getMessage ());
}
}
öffentliche Verbindung getConnection () {
versuchen{
// Benutzername + Passwort;
// Datenbankinformationen aus der Konfigurationsdatei lesen
GetPara ogetPara = new getPara ();
String Strip = OgetPara.getPara ("Serverip");
String strport = ogetPara.getPara ("Port");
String strdbname = ogetPara.getPara ("dbname");
String struser = ogetPara.getPara ("Benutzer");
String strPassword = ogetPara.getPara ("Passwort");
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, Struer, Strpassword);
} catch (Ausnahme ex) {
System.out.println ("Kann keine Verbindung erhalten:" + ex.getMessage ());
System.out.println ("Bitte überprüfen Sie, ob die Datenbankinformationen in der Konfigurationsdatei korrekt sind.");
}
zurück diese.myconnection;
}
}
2. Lesen Sie das BLOB -Feld
Fügen Sie der OracleQuerybean -Klasse eine Funktion hinzu, um den spezifischen Code wie folgt zu lesen:
Die Codekopie lautet wie folgt: public byte [] getImgBytebyId (String Strid, int w, int H) {
//System.out.println("Get IMG -Daten, die ID " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
versuchen {
Aussage STMT = MyConnection.CreateStatement ();
ResultSet MyresultSet = stmt.executeQuery ("select" + this.stridname + "von" + this.strtabname + "Where" + this.stridname + "=" + Strid);
StringBuffer mystringBuffer = new StringBuffer ();
if (MyresultSet.Next ()) {
java.sql.blob Blob = Myresultset.getBlob (this.strimgname);
InputStream Instream = Blob.GetBinaryStream ();
versuchen {
long nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("img Datengröße ist: " + nsize);
Data = neues Byte [nsize];
instream.read (Daten);
instream.close ();
} catch (ioException e) {
System.out.println ("Image -Data nicht erhalten, Grund:" + e.getMessage ());
}
Data = ChangeImgSize (Data, W, H);
}
System.out.println (MyStringBuffer.ToString ());
MyConnection.Commit ();
MyConnection.close ();
} catch (SQLEXception ex) {
System.out.println (ex.getMessage ());
}
Daten zurückgeben;
}
3.. Zoomen Sie das Bild
Da die Größe des Bildes inkonsistent ist, die Größe der Ausgabe auf der Seite muss jedoch einheitlich sein, muss eine Funktion zur Skalierung der OracleQuerybean -Klasse hinzugefügt werden.
Die Codekopie lautet wie folgt: private byte [] ChangeImgSize (Byte [] Daten, int nw, int nh) {
byte [] newdata = null;
versuchen{
Bufferedimage bis = imageio.read (neuer BytearrayinputStream (Daten));
int w = Bis.getWidth ();
int h = bis.getheight ();
doppelt sx = (doppelt) nW / w;
doppelte Sy = (doppelte) NH / H;
Affinetransform -Transformation = new Affinetransform ();
Transformation.Settoscale (SX, SY);
Affinetransformop ATO = neues Affinetransformop (Transformation, NULL);
// Originalfarbe
Bufferedimage bid = new bufferedImage (nW, nh, bufferedimage.type_3byte_bgr);
Ato.filter (Bis, Bid);
// in Byte Byte konvertieren
BytearrayoutputStream baos = new bytearrayoutputStream ();
Imageio.Write (Bid, "JPEG", Baos);
newdata = baos.tobytearray ();
} catch (ioException e) {
E. printstacktrace ();
}
Neudata zurückgeben;
}
V.
Kopieren Sie den Code wie folgt: < %@ Page Language = "java" contentType = "text/html; charset = gbk" %>
<JSP: UseBean id = "OrcleQuery" Scope = "Seite" />
<%
Antwort.SetContentType ("Image/JPEG");
// ID des Bildes in der Datenbank
String strid = request.getParameter ("id");
// in die Miniaturansicht oder vergrößern die Breite des Bildes
String strWidth = request.getParameter ("w");
// in die Miniaturansicht oder vergrößern die Höhe des Bildes
String strHeight = request.getParameter ("H");
byte [] data = null;
if (strid! = null) {
int nwith = Integer.ParseInt (strWidth);
int nHeight = Integer.ParseInt (strHeight);
// Erhalten Sie die Bytedaten des Bildes
Data = orcleQuery.getImgBytebyId (Strid, Nwith, nHeight);
ServLetOutputStream op = response.getOutputStream ();
op.write (data, 0, data.length);
op.close ();
op = null;
Antwort.FlushBuffer ();
// Löschen Sie den Ausgangsstrom, um die Erfassung von Ausnahmen während der Freisetzung zu verhindern
out.clear ();
out = pageContext.pushbody ();
}
%>
5. Der Gesamtcode der OracleQuerybean -Queryklasse
Der Dateicode von OracleQueryBean.java lautet wie folgt:
Die Codekopie lautet wie folgt: Importieren Sie Java.sql.*;
import Java.io.*;
import Javax.imageo.imageo;
Import Java.awt.image.BuffenedImage;
import Java.awt.image.Affinetransformop;
import Java.awt.geom.Affinetransform;
Öffentliche Klasse OracleQuerybean {
private endgültige String oracledRivername = "oracle.jdbc.driver.oracledriver";
private Verbindung myConnection = null;
private String Strtabname;
private String -Stridname;
private String Strimgname;
public OracleQuerybean () {
versuchen{
Class.ForName (oracledRivername);
} catch (classNotFoundException ex) {
System.out.println ("JDBC -Treiber nicht geladen, Grund:" + ex.getMessage ());
}
}
öffentliche Verbindung getConnection () {
versuchen{
// Benutzername + Passwort;
// Datenbankinformationen aus der Konfigurationsdatei lesen
GetPara ogetPara = new getPara ();
String Strip = OgetPara.getPara ("Serverip");
String strport = ogetPara.getPara ("Port");
String strdbname = ogetPara.getPara ("dbname");
String struser = ogetPara.getPara ("Benutzer");
String strPassword = ogetPara.getPara ("Passwort");
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, Struer, Strpassword);
} catch (Ausnahme ex) {
System.out.println ("Kann keine Verbindung erhalten:" + ex.getMessage ());
System.out.println ("Bitte überprüfen Sie, ob die Datenbankinformationen in der Konfigurationsdatei korrekt sind.");
}
zurück diese.myconnection;
}
public byte [] getImgBytebyId (String Strid, int w, int h) {
//System.out.println("Get IMG -Daten, die ID " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
versuchen {
Aussage STMT = MyConnection.CreateStatement ();
ResultSet MyresultSet = stmt.executeQuery ("select" + this.stridname + "von" + this.strtabname + "Where" + this.stridname + "=" + Strid);
StringBuffer mystringBuffer = new StringBuffer ();
if (MyresultSet.Next ()) {
java.sql.blob Blob = Myresultset.getBlob (this.strimgname);
InputStream Instream = Blob.GetBinaryStream ();
versuchen {
long nlen = blob.length ();
int nsize = (int) nlen;
//System.out.println("img Datengröße ist: " + nsize);
Data = neues Byte [nsize];
instream.read (Daten);
instream.close ();
} catch (ioException e) {
System.out.println ("Image -Data nicht erhalten, Grund:" + e.getMessage ());
}
Data = ChangeImgSize (Data, W, H);
}
System.out.println (MyStringBuffer.ToString ());
MyConnection.Commit ();
MyConnection.close ();
} catch (SQLEXception ex) {
System.out.println (ex.getMessage ());
}
Daten zurückgeben;
}
public byte [] GetImgbytebyId (String Strid) {
//System.out.println("Get IMG -Daten, die ID " + nid);
if (myconnection == null)
this.getConnection ();
byte [] data = null;
versuchen {
Aussage STMT = MyConnection.CreateStatement ();
ResultSet MyresultSet = stmt.executeQuery ("select" + this.stridname + "von" + this.strtabname + "Where" + this.stridname + "=" + Strid);
StringBuffer mystringBuffer = new StringBuffer ();
if (MyresultSet.Next ()) {
java.sql.blob Blob = Myresultset.getBlob (this.strimgname);
InputStream Instream = Blob.GetBinaryStream ();
versuchen {
long nlen = blob.length ();
int nsize = (int) nlen;
Data = neues Byte [nsize];
instream.read (Daten);
instream.close ();
} catch (ioException e) {
System.out.println ("Image -Data nicht erhalten, Grund:" + e.getMessage ());
}
}
System.out.println (MyStringBuffer.ToString ());
MyConnection.Commit ();
MyConnection.close ();
} catch (SQLEXception ex) {
System.out.println (ex.getMessage ());
}
Daten zurückgeben;
}
private byte [] ChangeImgSize (Byte [] Daten, int nw, int nh) {
byte [] newdata = null;
versuchen{
Bufferedimage bis = imageio.read (neuer BytearrayinputStream (Daten));
int w = Bis.getWidth ();
int h = bis.getheight ();
doppelt sx = (doppelt) nW / w;
doppelte Sy = (doppelte) NH / H;
Affinetransform -Transformation = new Affinetransform ();
Transformation.Settoscale (SX, SY);
Affinetransformop ATO = neues Affinetransformop (Transformation, NULL);
// Originalfarbe
Bufferedimage bid = new bufferedImage (nW, nh, bufferedimage.type_3byte_bgr);
Ato.filter (Bis, Bid);
// in Byte Byte konvertieren
BytearrayoutputStream baos = new bytearrayoutputStream ();
Imageio.Write (Bid, "JPEG", Baos);
newdata = baos.tobytearray ();
} catch (ioException e) {
E. printstacktrace ();
}
Neudata zurückgeben;
}
}
Nachfolgend finden Sie meinen Case Copy -Code zum Speichern von Lesen von Blob -Bildern wie folgt: importieren Sie Java.sql.*;
import Java.io.*;
öffentliche Klasse InsertPhoto {
public static void main (String [] args) löst Ausnahme {aus {
Class.forname ("com.mysql.jdbc.driver");
Verbindung con = driverManager.getConnection ("JDBC: MySQL: //127.0.0.1/WiseWeb? User = root & passwod = root");
Datei f = neue Datei ("e: /123.jpg");
FileInputStream fis = new FileInputStream (f);
String SQL = "In Foto (Foto, Photoname) einfügen (?,?)";
PreparedStatement pstmt = con.preparestatement (SQL);
pstmt.setBinaryStream (1, fis, (int) f.length ());
pstmt.setstring (2, "Testbild");
pstmt.executeUpdate ();
fis.close ();
pstmt.close ();
con.close ();
}
}
Die Codekopie lautet wie folgt: Importieren Sie java.awt.image.buffedImage;
import Java.io.BufferedInputStream;
importieren java.io.ioException;
importieren java.io.inputstream;
importieren java.io.outputstream;
Import Java.sql.Connection;
importieren java.sql.drivermanager;
importieren java.sql.resultset;
importieren java.sql.sqlexception;
importieren java.sql.statement;
import Javax.imageo.imageo;
import Javax.servlet.http.httpServlet;
importieren javax.servlet.http.httpServletRequest;
importieren javax.servlet.http.httpServletResponse;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegimageCoder;
öffentliche Klasse ReadPhoto erweitert HttpServlet {
private statische endgültige lange Serialversionuid = 1L;
public void dodget (httpServletRequest Request, httpServletResponse -Antwort) {
if (request.getParameter ("id")! = null) {
Antwort.SetContentType ("Image/JPEG");
versuchen {
InputStream ist = query_getPhotoimageBlob (Integer.ParseInt (request.getParameter ("id"))));
if (ist! = null) {
ist = neuer BufferedInputStream (IS);
Bufferedimage bi = imageio.read (ist);
OutputStream os = response.getOutputStream ();
JpegimageCoder cccoder = jpegcodec.createjpeGenCoder (OS);
ccoder.encode (bi);
os.close ();
IS.CLOSE ();
}
} catch (ioException e) {
E. printstacktrace ();
} catch (numberFormatexception e) {
// todo automatisch generierter Fangblock
E. printstacktrace ();
} catch (classNotFoundException e) {
// todo automatisch generierter Fangblock
E. printstacktrace ();
} catch (sqlexception e) {
// todo automatisch generierter Fangblock
E. printstacktrace ();
}
}
}
public static InputStream query_getPhotoimageBlob (int id) löst ClassNotFoundException, SQLEXception {aus
String sql = "Foto aus Foto auswählen wobei ID ="+id;
Verbindungs con = null;
Aussage STMT = NULL;
ResultSet rs = null;
InputStream -Ergebnis = null;
versuchen {
Class.forname ("com.mysql.jdbc.driver");
con = driverManager.getConnection ("JDBC: MySQL: //127.0.0.1/WiseWeb? User = root & passwod = root");
stmt = con.CreateStatement ();
rs = stmt.executeQuery (SQL);
if (rs.Next ())
result = rs.getBlob ("foto"). getBinaryStream ();
} catch (sqlexception e) {
// TODO: Ausnahme behandeln
System.err.println (e.getMessage ());
} Endlich{
rs.close ();
stmt.close ();
con.close ();
}
Rückgabeergebnis;
}
}
JSP zeigt den Code des Kopierens wie folgt an: <img src = "<%= Basepath%>/Genimage? ID = 3"/>
Der Kopiercode ist wie folgt in web.xml konfiguriert: <servlet>
<servlet-name> Genimage </Servlet-Name>
<Servlet-Class> Readphoto </Servlet-Klasse>
</servlet>
<Servlet-Mapping>
<servlet-name> Genimage </Servlet-Name>
<URL-Muster>/Genimage </url-pattern>
</Servlet-Mapping>
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.