บทความนี้อธิบายถึงวิธีการของ Java Reading BLOB Object Pictures จากฐานข้อมูลและแสดง แบ่งปันสำหรับการอ้างอิงของคุณ วิธีการใช้งานเฉพาะมีดังนี้:
วิธีแรก:
วิธีการทั่วไปคือการอ่านกระแส Blob จากฐานข้อมูลและเขียนลงในหน้า:
การคัดลอกรหัสมีดังนี้: การเชื่อมต่อ conn = dbmanager.getConnection ();
String sql = "เลือกรูปภาพจากครูโดยที่ id = 1";
PreparedStatement PS = NULL;
ผลลัพธ์ RS = NULL;
InputStream คือ = null;
OutputStream OS = NULL;
พยายาม {
ps = conn.prepareStatement (SQL);
rs = ps.executeQuery ();
ถ้า (rs.next ()) {
IS = Rs.getBinaryStream (1);
-
Response.SetContentType ("ข้อความ/html");
OS = response.getOutputStream ();
int num;
byte buf [] = ไบต์ใหม่ [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 = null;
สตริงส่วนตัว strtabname;
สตริงส่วนตัว stridname;
สตริงส่วนตัว strimgname;
Public OracleQueryBean () {
พยายาม{
class.forname (oracledrivername);
} catch (classnotFoundException ex) {
System.out.println ("ไม่สามารถโหลดไดรเวอร์ JDBC, เหตุผล:" + ex.getMessage ());
-
-
การเชื่อมต่อสาธารณะ getConnection () {
พยายาม{
// ชื่อผู้ใช้ + รหัสผ่าน;
// อ่านข้อมูลฐานข้อมูลจากไฟล์การกำหนดค่า
getPara ogetpara = ใหม่ getPara ();
string strip = ogetpara.getpara ("serverip");
strport strport = ogetpara.getpara ("พอร์ต");
string strdbname = ogetpara.getpara ("dbname");
String struser = ogetPara.getPara ("ผู้ใช้");
string strpassword = 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, strpassword);
} catch (exception ex) {
System.out.println ("ไม่สามารถรับการเชื่อมต่อ:" + ex.getMessage ());
System.out.println ("โปรดตรวจสอบว่าข้อมูลฐานข้อมูลในไฟล์การกำหนดค่าถูกต้องหรือไม่");
-
ส่งคืนสิ่งนี้การเชื่อมต่อ;
-
-
2. อ่านฟิลด์ Blob
เพิ่มฟังก์ชั่นลงในคลาส OracleQueryBean เพื่ออ่าน
การคัดลอกรหัสมีดังนี้: ไบต์สาธารณะ [] getimgbytebyid (String strid, int w, int h) {
//system.out.println("get img data คือ id " + nid);
ถ้า (myConnection == null)
this.getConnection ();
ไบต์ [] data = null;
พยายาม {
คำสั่ง stmt = myConnection.createstatement ();
Resultset myresultset = stmt.executeQuery ("เลือก" + this.stridName + "จาก" + this.strtabname + "โดยที่" + 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 = ไบต์ใหม่ [nsize];
INSTREAM.READ (ข้อมูล);
Instream.close ();
} catch (ioexception e) {
System.out.println ("ไม่สามารถรับข้อมูลภาพเหตุผล:" + e.getMessage ());
-
DATA = ChangeimGSize (ข้อมูล, W, H);
-
System.out.println (mystringbuffer.toString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
-
ส่งคืนข้อมูล
-
3. ซูมภาพ
เนื่องจากขนาดของภาพอาจไม่สอดคล้องกัน แต่ขนาดของเอาต์พุตในหน้าจำเป็นต้องรวมกันจึงจำเป็นต้องเพิ่มฟังก์ชั่นลงในคลาส OracleQueryBean เพื่อปรับขนาด
การคัดลอกรหัสมีดังนี้: BYTE ส่วนตัว [] CHANGEIMGSIZE (BYTE [] ข้อมูล, int NW, int NH) {
ไบต์ [] newData = null;
พยายาม{
bufferedImage bis = imageio.read (New ByteArrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
double sx = (double) nw / w;
double sy = (สองครั้ง) NH / H;
affineTransform transform = new affineTransform ();
transform.settoscale (SX, SY);
affineTransformop ato = new affineTransformop (transform, null);
// สีดั้งเดิม
BufferedImage BID = New BufferedImage (NW, NH, BufferedImage.type_3byte_bgr);
ato.filter (bis, ประมูล);
// แปลงเป็นไบต์ไบต์
ByTeArrayOutputStream BAOS = New ByTeArrayOutputStream ();
Imageio.write (เสนอราคา, "jpeg", baos);
newData = baos.tobytearray ();
} catch (ioexception e) {
E.PrintStackTrace ();
-
กลับ Newdata;
-
4. แสดงบนหน้าเว็บ
คัดลอกรหัสดังนี้: < %@ page language = "java" contentType = "ข้อความ/html ;; charset = gbk" %>
<jsp: usebean id = "orcleQuery" prope = "page" />>>>>
-
Response.SetContentType ("Image/JPEG");
// id ของภาพในฐานข้อมูล
String strid = request.getParameter ("id");
// ถึงรูปขนาดย่อหรือขยายความกว้างของภาพ
String strwidth = request.getParameter ("W");
// ถึงรูปขนาดย่อหรือขยายความสูงของภาพ
string strheight = request.getParameter ("H");
ไบต์ [] data = null;
ถ้า (strid! = null) {
int nwith = integer.parseint (strwidth);
int nheight = integer.parseint (striight);
// รับข้อมูลไบต์ของภาพ
data = orcleQuery.getimgbyTebyId (strid, nwith, nheight);
servletoutputStream op = response.getOutputStream ();
op.write (data, 0, data.length);
op.close ();
op = null;
Response.flushbuffer ();
// ล้างกระแสเอาต์พุตเพื่อป้องกันการจับข้อยกเว้นระหว่างการปล่อย
out.clear ();
out = pageContext.pushbody ();
-
-
5. รหัสโดยรวมของคลาส Query 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 () {
พยายาม{
// ชื่อผู้ใช้ + รหัสผ่าน;
// อ่านข้อมูลฐานข้อมูลจากไฟล์การกำหนดค่า
getPara ogetpara = ใหม่ getPara ();
string strip = ogetpara.getpara ("serverip");
strport strport = ogetpara.getpara ("พอร์ต");
string strdbname = ogetpara.getpara ("dbname");
String struser = ogetPara.getPara ("ผู้ใช้");
string strpassword = 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, strpassword);
} catch (exception ex) {
System.out.println ("ไม่สามารถรับการเชื่อมต่อ:" + ex.getMessage ());
System.out.println ("โปรดตรวจสอบว่าข้อมูลฐานข้อมูลในไฟล์การกำหนดค่าถูกต้องหรือไม่");
-
ส่งคืนสิ่งนี้การเชื่อมต่อ;
-
ไบต์สาธารณะ [] getimgbytebyid (String strid, int w, int h) {
//system.out.println("get img data คือ id " + nid);
ถ้า (myConnection == null)
this.getConnection ();
ไบต์ [] data = null;
พยายาม {
คำสั่ง stmt = myConnection.createstatement ();
Resultset myresultset = stmt.executeQuery ("เลือก" + this.stridName + "จาก" + this.strtabname + "โดยที่" + 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 = ไบต์ใหม่ [nsize];
INSTREAM.READ (ข้อมูล);
Instream.close ();
} catch (ioexception e) {
System.out.println ("ไม่สามารถรับข้อมูลภาพเหตุผล:" + e.getMessage ());
-
DATA = ChangeimGSize (ข้อมูล, W, H);
-
System.out.println (mystringbuffer.toString ());
myConnection.Commit ();
myConnection.close ();
} catch (sqlexception ex) {
System.out.println (ex.getMessage ());
-
ส่งคืนข้อมูล
-
ไบต์สาธารณะ [] getimgbytebyid (String strid) {
//system.out.println("get img data คือ id " + nid);
ถ้า (myConnection == null)
this.getConnection ();
ไบต์ [] data = null;
พยายาม {
คำสั่ง stmt = myConnection.createstatement ();
Resultset myresultset = stmt.executeQuery ("เลือก" + this.stridName + "จาก" + this.strtabname + "โดยที่" + 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 = ไบต์ใหม่ [nsize];
INSTREAM.READ (ข้อมูล);
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 ส่วนตัว [] DUALSIMGSIZE (BYTE [] ข้อมูล, int NW, int NH) {
ไบต์ [] newData = null;
พยายาม{
bufferedImage bis = imageio.read (New ByteArrayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
double sx = (double) nw / w;
double sy = (สองครั้ง) NH / H;
affineTransform transform = new affineTransform ();
transform.settoscale (SX, SY);
affineTransformop ato = new affineTransformop (transform, null);
// สีดั้งเดิม
BufferedImage BID = New BufferedImage (NW, NH, BufferedImage.type_3byte_bgr);
ato.filter (bis, ประมูล);
// แปลงเป็นไบต์ไบต์
ByTeArrayOutputStream BAOS = New ByTeArrayOutputStream ();
Imageio.write (เสนอราคา, "jpeg", baos);
newData = baos.tobytearray ();
} catch (ioexception e) {
E.PrintStackTrace ();
-
กลับ Newdata;
-
-
ด้านล่างนี้เป็นรหัสคัดลอกกรณีของฉันสำหรับการจัดเก็บภาพการอ่าน BLOB ดังนี้: นำเข้า 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 = "แทรกลงในรูปภาพ (รูปภาพ, 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 {
ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L;
โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) {
if (request.getParameter ("id")! = null) {
Response.SetContentType ("Image/JPEG");
พยายาม {
InputStream คือ = query_getphotoimageBlob (integer.parseint (request.getParameter ("id"))));
ถ้า (คือ! = null) {
IS = ใหม่ 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 catch block ที่สร้างอัตโนมัติ
E.PrintStackTrace ();
} catch (classnotFoundException e) {
// todo catch block ที่สร้างอัตโนมัติ
E.PrintStackTrace ();
} catch (sqlexception e) {
// todo catch block ที่สร้างอัตโนมัติ
E.PrintStackTrace ();
-
-
-
public public inputstream query_getphotoimageBlob (int id) พ่น classnotfoundexception, sqlexception {
String SQL = "เลือกรูปภาพจากรูปภาพโดยที่ id ="+id;
การเชื่อมต่อ con = null;
คำสั่ง stmt = null;
ผลลัพธ์ RS = NULL;
inputStream result = null;
พยายาม {
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 ())
result = rs.getBlob ("photo"). 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>
<servlet-mapping>
<servlet-name> genimage </servlet-name>
<url-pattern>/genimage </url-pattern>
</servlet-mapping>
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน