この記事では、データベースからBlobオブジェクトの写真を読んで表示する方法について説明します。参照のためにそれを共有してください。特定の実装方法は次のとおりです。
最初の方法:
一般的な方法は、データベースからブロブストリームを読み取り、ページに書き込むことです。
コードコピーは次のとおりです。接続conn = dbmanager.getConnection();
string sql = "id = 1"で教師から画像を選択します。
represedStatement PS = null;
結果rs = null;
inputstream is = null;
outputStream os = null;
試す {
ps = conn.preparestatement(sql);
rs = ps.executequery();
if(rs.next()){
is = rs.getBinaryStream(1);
}
Response.setContentType( "Text/HTML");
os = response.getOutputStream();
int num;
バイトbuf [] = new byte [1024];
while((num = is.read(buf))!= -1){
os.write(buf、0、num);
}
} catch(sqlexception e){
e.printstacktrace();
}
試す {
is.close();
os.close();
rs.close();
ps.close();
} catch(sqlexception e){
e.printstacktrace();
}
ページで:
次のようにコードをコピーします:<%
string path = request.getContextPath();
string basepath = request.getscheme()+"://"+request.getServername()+":"+request.getServerport()+path+"/";
%>
<img name = "pic" src = "<%= basepath+" servlet/downloadAsstream "%>"/>
それを成し遂げましょう。
2番目の方法:
プロセス全体が4つのステップに分かれています。Oracleデータベースに接続します - > Blobイメージフィールドを読み取り - >画像のスケーリング - > JSPページに画像を表示します。
コードコピーは次のとおりです。Java.sql。*をインポートします。
java.io.*をインポートします。
javax.imageio.imageioをインポートします。
java.awt.image.bufferedimageをインポートします。
java.awt.image.affinetransformopをインポートします。
java.awt.geom.affinetransformをインポートします。
パブリッククラスOracleQueryBean {
プライベートファイナルストリングoracledrivername = "oracle.jdbc.driver.oracledriver";
プライベート接続myConnection = null;
プライベート文字列strtabname;
プライベート文字列stridName;
プライベート文字列strimgname;
public oraclequerybean(){
試す{
class.forname(oracledrivername);
} catch(classNotFoundException ex){
system.out.println( "JDBCドライバーのロードに失敗しました。理由:" + ex.getMessage());
}
}
パブリック接続getConnection(){
試す{
// username +パスワード
//構成ファイルからデータベース情報を読み取ります
getPara ogetpara = new getPara();
string strip = ogetpara.getpara( "serverip");
string strport = ogetpara.getpara( "port");
string strdbname = ogetpara.getpara( "dbname");
string struser = ogetpara.getpara( "user");
string strpassword = ogetpara.getpara( "password");
this.strtabname = ogetpara.getpara( "tablename");
this.stridname = ogetpara.getpara( "imgidname");
this.strimgname = ogetpara.getpara( "imgname");
string oracleurltoconnect = "jdbc:oracle:shin:@"+strip+":"+strport+":"+strdbname;
this.myconnection = drivermanager.getConnection(oracleurltoconnect、Struser、strpassword);
} catch(例外Ex){
system.out.println( "接続を取得できない:" + ex.getMessage());
System.out.println( "構成ファイルのデータベース情報が正しいかどうかを確認してください。");
}
this.myconnectionを返します。
}
}
2。ブロブフィールドを読みます
OracleQueryBeanクラスに関数を追加して、次のように読みます。
コードコピーは次のとおりです。パブリックバイト[] getimgbytebyid(string strid、int w、int h){
//system.out.println("id is is " + nid);
if(myconnection == null)
this.getConnection();
byte [] data = null;
試す {
ステートメントstmt = myconnection.createstatement();
rester myResultset = stmt.executequery( "select" + this.stridname + "from" + 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();
試す {
long nlen = blob.length();
int nsize =(int)nlen;
//system.out.println("imgデータサイズは: " + nsize);
data = new byte [nsize];
instream.read(data);
instream.close();
} catch(ioException e){
System.out.println( "画像データの取得に失敗しました。理由:" + e.getMessage());
}
data = changeimgsize(data、w、h);
}
system.out.println(mystringbuffer.toString());
myconnection.commit();
myConnection.close();
} catch(sqlexception ex){
System.out.println(ex.getMessage());
}
データを返す;
}
3.写真をズームします
画像のサイズは一貫性がないかもしれませんが、ページの出力のサイズを統合する必要があるため、特定のコードは次のとおりです。
コードコピーは次のとおりです。プライベートバイト[] changeimgsize(byte [] data、int nw、int nh){
byte [] newData = null;
試す{
bufferedimage bis = imageio.read(new bytearrayinputStream(data));
int w = bis.getWidth();
int h = bis.getheight();
double sx =(double)nw / w;
double sy =(double)nh / h;
affintransform transform = new affinetransform();
transform.settoscale(sx、sy);
affintransformop ato = new affinetransformop(transform、null);
//オリジナル色
bufferedimage bid = new BufferedImage(NW、NH、BufferedImage.type_3byte_bgr);
ato.filter(bis、bid);
//バイトバイトに変換します
bytearrayoutputStream baos = new bytearrayoutputStream();
Imageio.write(bid、 "jpeg"、baos);
newData = baos.tobytearray();
} catch(ioException e){
e.printstacktrace();
}
NewDataを返します。
}
4。ページに表示されます。
コードを次のようにコピーします。
<jsp:usebean id = "orclequery" scope = "page" />
<%
Response.setContentType( "Image/jpeg");
//データベース内の画像のID
string strid = request.getParameter( "id");
//サムネイルに、または写真の幅を拡大します
string strwidth = request.getParameter( "w");
//サムネイルに、または写真の高さを拡大します
string strheight = request.getParameter( "h");
byte [] data = null;
if(strid!= null){
int nwith = integer.parseint(strwidth);
int nheight = integer.parseint(strheight);
//画像のバイトデータを取得します
data = orclequery.getimgbytebyid(strid、nwith、nheight);
servletoutputStream op = respons.getOutputStream();
op.write(data、0、data.length);
op.close();
op = null;
Response.flushbuffer();
//リリース中に例外のキャプチャを防ぐために出力ストリームをクリアします
out.clear();
out = pagecontext.pushbody();
}
%>
5. OracleQuerybeanクエリクラスの全体的なコード
oraclequerybean.javaファイルコードは次のとおりです。
コードコピーは次のとおりです。Java.sql。*をインポートします。
java.io.*をインポートします。
javax.imageio.imageioをインポートします。
java.awt.image.bufferedimageをインポートします。
java.awt.image.affinetransformopをインポートします。
java.awt.geom.affinetransformをインポートします。
パブリッククラスOracleQueryBean {
プライベートファイナルストリングoracledrivername = "oracle.jdbc.driver.oracledriver";
プライベート接続myConnection = null;
プライベート文字列strtabname;
プライベート文字列stridName;
プライベート文字列strimgname;
public oraclequerybean(){
試す{
class.forname(oracledrivername);
} catch(classNotFoundException ex){
system.out.println( "JDBCドライバーのロードに失敗しました。理由:" + ex.getMessage());
}
}
パブリック接続getConnection(){
試す{
// username +パスワード
//構成ファイルからデータベース情報を読み取ります
getPara ogetpara = new getPara();
string strip = ogetpara.getpara( "serverip");
string strport = ogetpara.getpara( "port");
string strdbname = ogetpara.getpara( "dbname");
string struser = ogetpara.getpara( "user");
string strpassword = ogetpara.getpara( "password");
this.strtabname = ogetpara.getpara( "tablename");
this.stridname = ogetpara.getpara( "imgidname");
this.strimgname = ogetpara.getpara( "imgname");
string oracleurltoconnect = "jdbc:oracle:shin:@"+strip+":"+strport+":"+strdbname;
this.myconnection = drivermanager.getConnection(oracleurltoconnect、Struser、strpassword);
} catch(例外Ex){
system.out.println( "接続を取得できない:" + ex.getMessage());
System.out.println( "構成ファイルのデータベース情報が正しいかどうかを確認してください。");
}
this.myconnectionを返します。
}
public byte [] getimgbytebyid(string strid、int w、int h){
//system.out.println("id is is " + nid);
if(myconnection == null)
this.getConnection();
byte [] data = null;
試す {
ステートメントstmt = myconnection.createstatement();
rester myResultset = stmt.executequery( "select" + this.stridname + "from" + 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();
試す {
long nlen = blob.length();
int nsize =(int)nlen;
//system.out.println("imgデータサイズは: " + nsize);
data = new byte [nsize];
instream.read(data);
instream.close();
} catch(ioException e){
System.out.println( "画像データの取得に失敗しました。理由:" + e.getMessage());
}
data = changeimgsize(data、w、h);
}
system.out.println(mystringbuffer.toString());
myconnection.commit();
myConnection.close();
} catch(sqlexception ex){
System.out.println(ex.getMessage());
}
データを返す;
}
public byte [] getimgbytebyid(string strid){
//system.out.println("id is is " + nid);
if(myconnection == null)
this.getConnection();
byte [] data = null;
試す {
ステートメントstmt = myconnection.createstatement();
rester myResultset = stmt.executequery( "select" + this.stridname + "from" + 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();
試す {
long nlen = blob.length();
int nsize =(int)nlen;
data = new byte [nsize];
instream.read(data);
instream.close();
} catch(ioException e){
System.out.println( "画像データの取得に失敗しました。理由:" + e.getMessage());
}
}
system.out.println(mystringbuffer.toString());
myconnection.commit();
myConnection.close();
} catch(sqlexception ex){
System.out.println(ex.getMessage());
}
データを返す;
}
private byte [] changeimgsize(byte [] data、int nw、int nh){
byte [] newData = null;
試す{
bufferedimage bis = imageio.read(new bytearrayinputStream(data));
int w = bis.getWidth();
int h = bis.getheight();
double sx =(double)nw / w;
double sy =(double)nh / h;
affintransform transform = new affinetransform();
transform.settoscale(sx、sy);
affintransformop ato = new affinetransformop(transform、null);
//オリジナル色
bufferedimage bid = new BufferedImage(NW、NH、BufferedImage.type_3byte_bgr);
ato.filter(bis、bid);
//バイトバイトに変換します
bytearrayoutputStream baos = new bytearrayoutputStream();
Imageio.write(bid、 "jpeg"、baos);
newData = baos.tobytearray();
} catch(ioException e){
e.printstacktrace();
}
NewDataを返します。
}
}
以下は、読み取りブロブ画像を次のように保存するための私のケースコピーコードです。
java.io.*をインポートします。
パブリッククラスInsertPhoto {
public static void main(string [] args)スロー例外{
class.forname( "com.mysql.jdbc.driver");
接続con = drivermanager.getConnection( "jdbc:mysql://127.0.1/wiseweb?user = root&password = root");
ファイルf = new file( "e:/123.jpg");
fileInputStream fis = new fileInputStream(f);
string sql = "写真(写真、photoname)値(?、?)に挿入されます";
preatedStatement pstmt = con.preparestatement(sql);
pstmt.setbinarystream(1、fis、(int)f.length());
pstmt.setString(2、 "Test Picture");
pstmt.executeupdate();
fis.close();
pstmt.close();
con.close();
}
}
コードコピーは次のとおりです。Java.awt.image.BufferedImageをインポートします。
java.io.bufferedinputStreamをインポートします。
java.io.ioexceptionをインポートします。
java.io.inputStreamをインポートします。
java.io.outputStreamをインポートします。
Java.sql.Connectionをインポートします。
Java.sql.drivermanagerをインポートします。
java.sql.resultsetをインポートします。
java.sql.sqlexceptionをインポートします。
java.sql.Statementをインポートします。
javax.imageio.imageioをインポートします。
javax.servlet.http.httpservletをインポートします。
javax.servlet.http.httpservletrequestをインポートします。
javax.servlet.http.httpservletResponseをインポートします。
com.sun.image.codec.jpeg.jpegcodecをインポートします。
com.sun.image.codec.jpeg.jpegimageencoderをインポートします。
public class readphotoはhttpservletを拡張します{
private static final long serialversionuid = 1l;
public void doget(httpservletrequest request、httpservletresponse応答){
if(request.getParameter( "id")!= null){
Response.setContentType( "Image/jpeg");
試す {
inputstream is = query_getPhotoimageBlob(integer.parseint(request.getParameter( "id"))));
if(is!= 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){
// TODO自動生成キャッチブロック
e.printstacktrace();
} catch(classNotFoundException e){
// TODO自動生成キャッチブロック
e.printstacktrace();
} catch(sqlexception e){
// TODO自動生成キャッチブロック
e.printstacktrace();
}
}
}
public static inputstream query_getphotoimageblob(int id)throws classNotFoundException、sqlexception {
文字列sql = "写真から写真を選択します="+id;
接続con = null;
ステートメントstmt = null;
結果rs = null;
inputstream result = null;
試す {
class.forname( "com.mysql.jdbc.driver");
con = drivermanager.getConnection( "jdbc:mysql://127.0.1/wiseweb?user = root&password = root");
stmt = con.createstatement();
rs = stmt.executequery(sql);
if(rs.next())
result = rs.getBlob( "写真")。getBinaryStream();
} catch(sqlexception e){
// TODO:例外を処理します
System.err.println(e.getMessage());
} ついに{
rs.close();
stmt.close();
con.close();
}
返品結果;
}
}
JSPは次のようにコピーコードを表示します。<img src = "<%= basepath%>/genimage?id = 3"/>
コピーコードは次のようにWeb.xmlで構成されています:<Servlet>
<servlet-name> genimage </servlet-name>
<servlet-class> readphoto </servlet-class>
</サーブレット>
<サーブレットマッピング>
<servlet-name> genimage </servlet-name>
<url-pattern>/genimage </url-pattern>
</サーブレットマッピング>
この記事がみんなのJavaプログラミングに役立つことを願っています。