تصف هذه المقالة طريقة Java Reading Blob Object من قاعدة بيانات وعرضها. شاركه للرجوع إليه. طريقة التنفيذ المحددة هي كما يلي:
الطريقة الأولى:
الطريقة العامة هي قراءة دفق النقطة من قاعدة البيانات وكتابته إلى الصفحة:
نسخة الكود كما يلي: connection conn = dbmanager.getConnection () ؛
String SQL = "حدد الصورة من المعلم حيث معرف = 1" ؛
أعدت PS = NULL ؛
resultset rs = null ؛
inputStream هو = فارغ ؛
OutputStream OS = NULL ؛
يحاول {
ps = conn.preparestatement (SQL) ؛
rs = ps.executequery () ؛
if (rs.next ()) {
IS = rs.getBinaryStream (1) ؛
}
استجابة.
OS = response.getOutputStream () ؛
int num ؛
بايت بوف [] = بايت جديد [1024] ؛
بينما ((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 "٪>"/>
انجزها.
الطريقة الثانية:
يتم تقسيم العملية بأكملها إلى أربع خطوات: قم بالاتصال بقاعدة بيانات 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 = فارغة ؛
سلسلة خاصة strtabname ؛
سلسلة خاصة stridname ؛
سلسلة خاصة Strimgname ؛
العامة oraclequerebean () {
يحاول{
class.forname (oracledrivername) ؛
} catch (classnotfoundException ex) {
System.out.println ("فشل في تحميل برنامج تشغيل JDBC ، السبب:" + ex.getMessage ()) ؛
}
}
الاتصال العام getConnection () {
يحاول{
// اسم المستخدم + كلمة المرور ؛
// قراءة معلومات قاعدة البيانات من ملف التكوين
getPara ogetpara = new getPara () ؛
String Strip = OgetPara.getPara ("serverip") ؛
String strport = ogetpara.getPara ("port") ؛
String strdbname = ogetpara.getPara ("dbname") ؛
String Struser = OgetPara.getPara ("المستخدم") ؛
String strapsword = ogetpara.getpara ("كلمة المرور") ؛
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 ، strapsword) ؛
} catch (استثناء ex) {
System.out.println ("لا يمكن الحصول على اتصال:" + ex.getMessage ()) ؛
System.out.println ("يرجى التحقق مما إذا كانت معلومات قاعدة البيانات في ملف التكوين صحيحة.") ؛
}
إرجاع this.myconnection ؛
}
}
2. اقرأ حقل Blob
إضافة وظيفة إلى فئة Oraclequerybean للقراءة.
نسخة الكود كما يلي: Public Byte [] GetImgbyTebyid (String strid ، int w ، int h) {
//system.out.println (بيانات IMGget التي هي معرف " + nid) ؛
إذا (myConnection == NULL)
this.getConnection () ؛
بايت [] البيانات = فارغة ؛
يحاول {
بيان stmt = myconnection.createstatement () ؛
resultset 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 (حجم البيانات IS IS: " + nsize) ؛
البيانات = بايت جديد [nsize] ؛
instream.read (data) ؛
instream.close () ؛
} catch (ioException e) {
System.out.println ("فشل في الحصول على بيانات الصورة ، السبب:" + E.GetMessage ()) ؛
}
البيانات = changeImgSize (البيانات ، W ، H) ؛
}
System.out.println (MyStringBuffer.ToString ()) ؛
myConnection.Commit () ؛
myconnection.close () ؛
} catch (sqlexception ex) {
System.out.println (ex.getMessage ()) ؛
}
إرجاع البيانات ؛
}
3. تكبير الصورة
نظرًا لأن حجم الصورة قد يكون غير متسق ، ولكن يجب أن يكون حجم الإخراج في الصفحة موحدة ، حيث يجب إضافة وظيفة إلى فئة Oraclequerybean.
نسخة الكود كما يلي: Byte Byte [] changeImgsize (Byte [] Data ، int NW ، int nh) {
Byte [] NewData = NULL ؛
يحاول{
BufferEdImage BIS = Imageio.Read (BYTEARRAYINPUTSTREAM (DATA)) ؛
int w = bis.getWidth () ؛
int h = bis.getheight () ؛
Double SX = (مزدوج) NW / W ؛
مزدوج SY = (مزدوج) NH / H ؛
AffinetRans Transform = AffinetRansform () جديد ؛
transform.Settoscale (SX ، SY) ؛
AffinetRansformop ATO = AffinetRansformop جديد (تحويل ، فارغ) ؛
// اللون الأصلي
BufferedImage Bid = جديد BufferEdImage (NW ، NH ، BufferedImage.type_3byte_bgr) ؛
ato.filter (BIS ، BID) ؛
// تحويل إلى بايت بايت
bytearrayoutputstream baoS = جديد bytearrayoutputStream () ؛
imageio.write (BID ، "JPEG" ، BAOS) ؛
newData = baos.tobytearray () ؛
} catch (ioException e) {
E.PrintStackTrace () ؛
}
إرجاع Newdata ؛
}
4. عرض الصفحة.
انسخ الرمز كما يلي: <٪@ page language = "java" contentType = "text/html ؛؛ charset = gbk" ٪>
<JSP: usebean id = "orclequery" scope = "page" />
<٪
استجابة.
// معرف الصورة في قاعدة البيانات
String strid = request.getParameter ("id") ؛
// إلى الصورة المصغرة أو تكبير عرض الصورة
String strwidth = request.getParameter ("W") ؛
// إلى الصورة المصغرة أو توسيع ارتفاع الصورة
String strheight = request.getParameter ("H") ؛
بايت [] البيانات = فارغة ؛
if (strid! = null) {
int nwith = integer.parseint (strwidth) ؛
int nheight = integer.parseint (strheight) ؛
// احصل على بيانات البايت للصورة
data = orclequery.getimgbytebyid (strid ، nwith ، nheight) ؛
servleToutPutStream op = response.getOutputStream () ؛
op.write (البيانات ، 0 ، data.length) ؛
op.close () ؛
OP = NULL ؛
استجابة. 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 = فارغة ؛
سلسلة خاصة strtabname ؛
سلسلة خاصة stridname ؛
سلسلة خاصة Strimgname ؛
العامة oraclequerebean () {
يحاول{
class.forname (oracledrivername) ؛
} catch (classnotfoundException ex) {
System.out.println ("فشل في تحميل برنامج تشغيل JDBC ، السبب:" + ex.getMessage ()) ؛
}
}
الاتصال العام getConnection () {
يحاول{
// اسم المستخدم + كلمة المرور ؛
// قراءة معلومات قاعدة البيانات من ملف التكوين
getPara ogetpara = new getPara () ؛
String Strip = OgetPara.getPara ("serverip") ؛
String strport = ogetpara.getPara ("port") ؛
String strdbname = ogetpara.getPara ("dbname") ؛
String Struser = OgetPara.getPara ("المستخدم") ؛
String strapsword = ogetpara.getpara ("كلمة المرور") ؛
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 ، strapsword) ؛
} catch (استثناء ex) {
System.out.println ("لا يمكن الحصول على اتصال:" + ex.getMessage ()) ؛
System.out.println ("يرجى التحقق مما إذا كانت معلومات قاعدة البيانات في ملف التكوين صحيحة.") ؛
}
إرجاع this.myconnection ؛
}
البايت العام [] getImgbyTebyid (سلسلة strid ، int w ، int h) {
//system.out.println (بيانات IMGget التي هي معرف " + nid) ؛
إذا (myConnection == NULL)
this.getConnection () ؛
بايت [] البيانات = فارغة ؛
يحاول {
بيان stmt = myconnection.createstatement () ؛
resultset 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 (حجم البيانات IS IS: " + nsize) ؛
البيانات = بايت جديد [nsize] ؛
instream.read (data) ؛
instream.close () ؛
} catch (ioException e) {
System.out.println ("فشل في الحصول على بيانات الصورة ، السبب:" + E.GetMessage ()) ؛
}
البيانات = changeImgSize (البيانات ، W ، H) ؛
}
System.out.println (MyStringBuffer.ToString ()) ؛
myConnection.Commit () ؛
myconnection.close () ؛
} catch (sqlexception ex) {
System.out.println (ex.getMessage ()) ؛
}
إرجاع البيانات ؛
}
البايت العام [] getImgbytebyid (سلسلة strid) {
//system.out.println (بيانات IMGget التي هي معرف " + nid) ؛
إذا (myConnection == NULL)
this.getConnection () ؛
بايت [] البيانات = فارغة ؛
يحاول {
بيان stmt = myconnection.createstatement () ؛
resultset 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 ؛
البيانات = بايت جديد [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 ()) ؛
}
إرجاع البيانات ؛
}
Byte Byte [] changeImgsize (Byte [] Data ، int NW ، int nh) {
Byte [] NewData = NULL ؛
يحاول{
BufferEdImage BIS = Imageio.Read (BYTEARRAYINPUTSTREAM (DATA)) ؛
int w = bis.getWidth () ؛
int h = bis.getheight () ؛
Double SX = (مزدوج) NW / W ؛
مزدوج SY = (مزدوج) NH / H ؛
AffinetRans Transform = AffinetRansform () جديد ؛
transform.Settoscale (SX ، SY) ؛
AffinetRansformop ATO = AffinetRansformop جديد (تحويل ، فارغ) ؛
// اللون الأصلي
BufferedImage Bid = جديد BufferEdImage (NW ، NH ، BufferedImage.type_3byte_bgr) ؛
ato.filter (BIS ، BID) ؛
// تحويل إلى بايت بايت
bytearrayoutputstream baoS = جديد bytearrayoutputStream () ؛
imageio.write (BID ، "JPEG" ، BAOS) ؛
newData = baos.tobytearray () ؛
} catch (ioException e) {
E.PrintStackTrace () ؛
}
إرجاع Newdata ؛
}
}
فيما يلي رمز نسخ الحالة لتخزين صور القراءة على النحو التالي: استيراد java.sql.*؛
استيراد java.io.*؛
الطبقة العامة insertphoto {
الفراغ الثابت العام (سلسلة [] args) يلقي الاستثناء {
class.forname ("com.mysql.jdbc.driver") ؛
Connection con = drivermanager.getConnection ("jdbc: mysql: //127.0.0.1/wiseweb؟ user = root & password = root") ؛
ملف f = ملف جديد ("E: /123.jpg") ؛
FileInputStream fis = جديد fileInputStream (f) ؛
String sql = "insert in photo (photo ، photoname) القيم (؟ ،؟)" ؛
preparedStatement PSTMT = con.preparestatement (SQL) ؛
pStMt.SetBinaryStream (1 ، Fis ، (int) f.length ()) ؛
PSTMT.SetString (2 ، "صورة اختبار") ؛
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 ؛
يمتد الفئة العامة readphoto httpservlet {
خاص ثابت نهائي طويل المسبانيويد = 1L ؛
DOGED void public (طلب httpservletrequest ، httpservletresponse استجابة) {
if (request.getParameter ("id")! = null) {
استجابة.
يحاول {
inputStream هو = query_getphotoimageblob (integer.parseint (request.getParameter ("id")))) ؛
إذا (هو! = فارغ) {
هو = جديد bufferedInputStream (هو) ؛
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 AUTO CATCH BLOCK
E.PrintStackTrace () ؛
} catch (classnotfoundException e) {
// TODO AUTO CATCH BLOCK
E.PrintStackTrace () ؛
} catch (sqlexception e) {
// TODO AUTO CATCH BLOCK
E.PrintStackTrace () ؛
}
}
}
إدخال Queery_GetPhotoImageblob (INT ID) الثابت العام Query_GetPhotoImageblob (INT)
String sql = "حدد الصورة من الصورة حيث id ="+id ؛
الاتصال con = null ؛
بيان stmt = فارغة ؛
resultset rs = null ؛
نتيجة inputStream = فارغة ؛
يحاول {
class.forname ("com.mysql.jdbc.driver") ؛
con = drivermanager.getConnection ("jdbc: mysql: //127.0.0.1/wiseweb؟ user = root & password = root") ؛
stmt = con.createstatement () ؛
rs = stmt.executequery (sql) ؛
إذا (rs.next ())
النتيجة = rs.getBlob ("photo"). getBinaryStream () ؛
} catch (sqlexception e) {
// تودو: التعامل مع الاستثناء
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>
<Sradlet-Class> ReadPhoto </servlet-class>
</servlet>
<Servlet Mapping>
<servlet-name> genimage </servlet-name>
<url-pattern>/genimage </url-pattern>
</servlet mapping>
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.