Cet article décrit la méthode des images d'objets Blob Java Reading à partir d'une base de données et les affichant. Partagez-le pour votre référence. La méthode de mise en œuvre spécifique est la suivante:
La première méthode:
La méthode générale consiste à lire le flux Blob à partir de la base de données et à l'écrire dans la page:
La copie de code est la suivante: connexion conn = dbmanager.getConnection ();
String sql = "Sélectionner l'image dans le professeur où id = 1";
PréparedStatement PS = null;
ResultSet rs = null;
InputStream est = null;
OutputStream os = null;
essayer {
ps = conn.preparestatement (SQL);
rs = ps.ExecuteQuery ();
if (Rs.Next ()) {
est = Rs.GetBinaryStream (1);
}
réponse.setContentType ("Text / HTML");
OS = Response.getOutputStream ();
int num;
octet buf [] = nouveau octet [1024];
while ((num = is.read (buf))! = - 1) {
os.write (buf, 0, num);
}
} catch (sqlexception e) {
e.printStackTrace ();
}
essayer {
is.close ();
os.close ();
Rs.Close ();
ps.close ();
} catch (sqlexception e) {
e.printStackTrace ();
}
Dans la page:
Copiez le code comme suit: <%
String path = request.getContextPath ();
String basepath = request.getscheme () + ": //" + request.getServerName () + ":" + request.getServerport () + path + "/";
%>
<img name = "pic" src = "<% = baspath +" servlet / downloadAsstream "%>" />
Faites-le.
La deuxième méthode:
L'ensemble du processus est divisé en quatre étapes: Connectez-vous à la base de données Oracle -> Lisez le champ Image Blob -> Échelle de l'image -> Affichage de l'image sur la page JSP.
La copie de code est la suivante: Importer java.sql. *;
importer java.io. *;
import javax.imageio.imageio;
Importer java.awt.image.bufferedImage;
Importer java.awt.image.AffinetRansformop;
Importer java.awt.geom.AffinetRansform;
classe publique OracleQueryBean {
chaîne finale privée oracledrivername = "oracle.jdbc.driver.oracledriver";
connexion privée myConnection = null;
chaîne privée strtabname;
Stridname privé;
StrimGname de chaîne privée;
public OracleQueryBean () {
essayer{
Class.forname (oracledrivername);
} catch (classNotFoundException ex) {
System.out.println ("Impossible de charger le pilote JDBC, raison:" + ex.getMessage ());
}
}
Connexion publique getConnection () {
essayer{
// nom d'utilisateur + mot de passe; le test utilisé ci-dessous est l'espace de table dans Oracle
// Lire les informations de la base de données du fichier de configuration
GetPara ogetPara = new GetPara ();
String strip = ogetPara.getPara ("serverip");
String strport = ogetPara.getPara ("port");
String strdbname = ogetPara.getPara ("dbname");
String StrUser = ogetPara.getPara ("utilisateur");
String strpassword = ogetPara.getPara ("mot de passe");
this.strtabname = ogetPara.getPara ("tablename");
this.stridName = ogetPara.getPara ("imgidName");
this.strimGname = ogetPara.getPara ("imGname");
String oracleUrltoConnect = "jdbc: oracle: mince: @" + strip + ":" + strport + ":" + strdbname;
this.myConnection = driverManager.getConnection (OracleUrlToConnect, StrUser, strpassword);
} catch (exception ex) {
System.out.println ("ne peut pas obtenir de connexion:" + ex.getMessage ());
System.out.println ("Veuillez vérifier si les informations de base de données dans le fichier de configuration sont correctes.");
}
Renvoyez ceci.myConnection;
}
}
2. Lisez le champ blob
Ajoutez une fonction à la classe OracleQueryBean à lire.
La copie de code est la suivante: octet public [] getImgByteById (String Strid, int w, int h) {
//System.out.println(" de données IMG quels id est "+ NID);
if (myConnection == null)
this.getConnection ();
octet [] data = null;
essayer {
Instruction stmt = myConnection.CreateStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("SELECT" + this.stridname + "From" + this.strtabname + "où" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimGname);
InputStream insiteam = blob.getBinaryStream ();
essayer {
long nlen = blob.length ();
int nSize = (int) nlen;
//System.out.println("img que la taille des données est: "+ nSize);
data = nouveau octet [nSize];
instream.read (data);
instream.close ();
} catch (ioexception e) {
System.out.println ("n'a pas réussi à obtenir des données d'image, raison:" + e.getMessage ());
}
data = changeImgSize (data, w, h);
}
System.out.println (MyStringBuffer.ToString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retourner les données;
}
3. Zoom de l'image
Étant donné que la taille de l'image peut être incohérente, mais la taille de la sortie dans la page doit être unifiée, une fonction doit être ajoutée à la classe OracleQueryBean à l'échelle.
La copie de code est la suivante: octet privé [] changeImgSize (byte [] data, int nw, int nh) {
octet [] newdata = null;
essayer{
BufferedImage bis = imageo.read (nouveau bytearrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
double sx = (double) nw / w;
double sy = (double) nh / h;
AffineTransform transform = new AffineTransform ();
transform.setToscale (SX, SY);
AffineTransformop ato = new AffineTransformop (transform, null);
// couleur d'origine
BufferedImage Bid = new BufferedImage (NW, NH, BufferedImage.Type_3Byte_BGR);
ato.filter (bis, bid);
// Convertir en octet octet
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIo.Write (Bid, "JPEG", Baos);
newData = baos.ToByteArray ();
} catch (ioexception e) {
e.printStackTrace ();
}
retourner newdata;
}
4. Afficher la page de la page.
Copiez le code comme suit: <% @ page linguisse = "java" contentType = "text / html ;; charset = gbk"%>
<jsp: usebean id = "orclequery" scope = "page" />
<%
réponse.setContentType ("Image / JPEG");
// ID de l'image dans la base de données
String strid = request.getParameter ("id");
// à la vignette ou à élargir la largeur de l'image
String strwidth = request.getParameter ("w");
// à la vignette ou agrandir la hauteur de l'image
String strheight = request.getParameter ("h");
octet [] data = null;
if (strid! = null) {
int nwith = Integer.ParseInt (strwidth);
int nHeight = Integer.ParseInt (Strheight);
// Obtenez les données d'octets de l'image
data = orclequery.getImgByteById (Strid, nwith, nheight);
ServletOutputStream op = réponse.getOutputStream ();
op.write (data, 0, data.length);
op.close ();
op = null;
réponse.flushBuffer ();
// efface le flux de sortie pour éviter la capture d'exceptions pendant la libération
Out.Clear ();
out = pageContext.pushbody ();
}
%>
5. Le code global de la classe de requête OracleQueryBean
Le code de fichier OracleQueryBean.java est le suivant:
La copie de code est la suivante: Importer java.sql. *;
importer java.io. *;
import javax.imageio.imageio;
Importer java.awt.image.bufferedImage;
Importer java.awt.image.AffinetRansformop;
Importer java.awt.geom.AffinetRansform;
classe publique OracleQueryBean {
chaîne finale privée oracledrivername = "oracle.jdbc.driver.oracledriver";
connexion privée myConnection = null;
chaîne privée strtabname;
Stridname privé;
StrimGname de chaîne privée;
public OracleQueryBean () {
essayer{
Class.forname (oracledrivername);
} catch (classNotFoundException ex) {
System.out.println ("Impossible de charger le pilote JDBC, raison:" + ex.getMessage ());
}
}
Connexion publique getConnection () {
essayer{
// nom d'utilisateur + mot de passe; le test utilisé ci-dessous est l'espace de table dans Oracle
// Lire les informations de la base de données du fichier de configuration
GetPara ogetPara = new GetPara ();
String strip = ogetPara.getPara ("serverip");
String strport = ogetPara.getPara ("port");
String strdbname = ogetPara.getPara ("dbname");
String StrUser = ogetPara.getPara ("utilisateur");
String strpassword = ogetPara.getPara ("mot de passe");
this.strtabname = ogetPara.getPara ("tablename");
this.stridName = ogetPara.getPara ("imgidName");
this.strimGname = ogetPara.getPara ("imGname");
String oracleUrltoConnect = "jdbc: oracle: mince: @" + strip + ":" + strport + ":" + strdbname;
this.myConnection = driverManager.getConnection (OracleUrlToConnect, StrUser, strpassword);
} catch (exception ex) {
System.out.println ("ne peut pas obtenir de connexion:" + ex.getMessage ());
System.out.println ("Veuillez vérifier si les informations de base de données dans le fichier de configuration sont correctes.");
}
Renvoyez ceci.myConnection;
}
octet public [] getImgByteById (String Strid, int w, int h) {
//System.out.println(" de données IMG quels id est "+ NID);
if (myConnection == null)
this.getConnection ();
octet [] data = null;
essayer {
Instruction stmt = myConnection.CreateStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("SELECT" + this.stridname + "From" + this.strtabname + "où" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimGname);
InputStream insiteam = blob.getBinaryStream ();
essayer {
long nlen = blob.length ();
int nSize = (int) nlen;
//System.out.println("img que la taille des données est: "+ nSize);
data = nouveau octet [nSize];
instream.read (data);
instream.close ();
} catch (ioexception e) {
System.out.println ("n'a pas réussi à obtenir des données d'image, raison:" + e.getMessage ());
}
data = changeImgSize (data, w, h);
}
System.out.println (MyStringBuffer.ToString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retourner les données;
}
octet public [] getImgByteById (String Strid) {
//System.out.println(" de données IMG quels id est "+ NID);
if (myConnection == null)
this.getConnection ();
octet [] data = null;
essayer {
Instruction stmt = myConnection.CreateStatement ();
ResultSet myResultSet = stmt.ExecuteQuery ("SELECT" + this.stridname + "From" + this.strtabname + "où" + this.stridname + "=" + strid);
StringBuffer myStringBuffer = new StringBuffer ();
if (myResultSet.next ()) {
java.sql.blob blob = myResultSet.getBlob (this.strimGname);
InputStream insiteam = blob.getBinaryStream ();
essayer {
long nlen = blob.length ();
int nSize = (int) nlen;
data = nouveau octet [nSize];
instream.read (data);
instream.close ();
} catch (ioexception e) {
System.out.println ("n'a pas réussi à obtenir des données d'image, raison:" + e.getMessage ());
}
}
System.out.println (MyStringBuffer.ToString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
}
retourner les données;
}
octet privé [] changeImgSize (octet [] données, int nw, int nh) {
octet [] newdata = null;
essayer{
BufferedImage bis = imageo.read (nouveau bytearrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
double sx = (double) nw / w;
double sy = (double) nh / h;
AffineTransform transform = new AffineTransform ();
transform.setToscale (SX, SY);
AffineTransformop ato = new AffineTransformop (transform, null);
// couleur d'origine
BufferedImage Bid = new BufferedImage (NW, NH, BufferedImage.Type_3Byte_BGR);
ato.filter (bis, bid);
// Convertir en octet octet
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIo.Write (Bid, "JPEG", Baos);
newData = baos.ToByteArray ();
} catch (ioexception e) {
e.printStackTrace ();
}
retourner newdata;
}
}
Vous trouverez ci-dessous mon code de copie de cas pour le stockage d'images Blob en lecture comme suit: Importer java.sql. *;
importer java.io. *;
classe publique insertphoto {
public static void main (String [] args) lève une exception {
Class.forname ("com.mysql.jdbc.driver");
Connexion con = driverManager.getConnection ("jdbc: mysql: //127.0.0.1/wiseb? User = root & mot de passe = root");
Fichier f = nouveau fichier ("e: /123.jpg");
FileInputStream fis = new FileInputStream (f);
String sql = "INSERT INTO PHOTO (Photo, Photoname) VALEURS (?,?)";
PREATYSATATION PSTMT = CON.PREPARESTATION (SQL);
pstmt.setbinarystream (1, fis, (int) f.length ());
PSTMT.SetString (2, "Test Picture");
pstmt.ExecuteUpdate ();
fis.close ();
pstmt.close ();
con.close ();
}
}
La copie de code est la suivante: Importer java.awt.image.bufferedImage;
Importer java.io.BufferedInputStream;
Importer java.io.ioException;
import java.io.inputStream;
import java.io.outputStream;
import java.sql.connection;
Importer Java.Sql.DiverManager;
import java.sql.resultSet;
import java.sql.sqlexception;
import java.sql.statement;
import javax.imageio.imageio;
import javax.servlet.http.httpservlet;
Importer javax.servlet.http.httpservletRequest;
import javax.servlet.http.httpservletResponse;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegImageEncoder;
classe publique readphoto étend httpservlet {
Long SerialVersionUID privé statique statique = 1L;
public void doGet (demande httpservletRequest, réponse httpservletResponse) {
if (request.getParameter ("id")! = null) {
réponse.setContentType ("Image / JPEG");
essayer {
InputStream est = query_getPhotoimageBlob (Integer.ParseInt (request.getParameter ("id"))));
if (est! = null) {
is = new BufferedInputStream (IS);
BufferedImage Bi = ImageIo.read (IS);
OutputStream OS = Response.getOutputStream ();
JpegImageEncoder Encoder = jPegCodec.CreateJPegenCoder (OS);
Encoder.Encode (BI);
os.close ();
is.close ();
}
} catch (ioexception e) {
e.printStackTrace ();
} catch (NumberFormatexception e) {
// Bloc de capture généré automatiquement de TODO
e.printStackTrace ();
} catch (classNotFoundException e) {
// Bloc de capture généré automatiquement de TODO
e.printStackTrace ();
} catch (sqlexception e) {
// Bloc de capture généré automatiquement de TODO
e.printStackTrace ();
}
}
}
Public Static InputStream Query_getPhotoimageBlob (int id) lève ClassNotFoundException, SQLEXception {
String sql = "SELECT Photo sur photo où id =" + id;
Connexion con = null;
Déclaration stmt = null;
ResultSet rs = null;
Résultat InputStream = NULL;
essayer {
Class.forname ("com.mysql.jdbc.driver");
con = driverManager.getConnection ("jdbc: mysql: //127.0.0.1/wiseb? user = root & mot de passe = root");
stmt = con.creataStation ();
rs = stmt.ExecuteQuery (SQL);
if (Rs.Next ())
result = Rs.getBlob ("photo"). getBinaryStream ();
} catch (sqlexception e) {
// TODO: gérer l'exception
System.err.println (e.getMessage ());
} enfin{
Rs.Close ();
stmt.close ();
con.close ();
}
Résultat de retour;
}
}
JSP affiche le code de code de copie comme suit: <img src = "<% = basepath%> / genimage? id = 3" />
Le code de copie est configuré dans web.xml comme suit: <Serplet>
<Servlet-Name> Genimage </Servlet-Name>
<servlet-Class> readphoto </ servlet-Class>
</vrlet>
<mappage servlet>
<Servlet-Name> Genimage </Servlet-Name>
<url-sattern> / genimage </url-sattern>
</ serflet-mapping>
J'espère que cet article sera utile à la programmation Java de tous.