이 기사에서는 데이터베이스에서 Blob Object 사진을 읽고 표시하는 Java를 읽는 방법에 대해 설명합니다. 참조를 위해 공유하십시오. 특정 구현 방법은 다음과 같습니다.
첫 번째 방법 :
일반적인 방법은 데이터베이스에서 Blob 스트림을 읽고 페이지에 쓰는 것입니다.
코드 사본은 다음과 같습니다. Connection Conn = DBManager.getConnection ();
문자열 sql = "id = 1"교사에서 사진을 선택하십시오.
준비된 상태 ps = null;
resultSet rs = null;
입력 스트림은 = 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 [] = 새로운 바이트 [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 ();
}
페이지에서 :
다음과 같이 코드를 복사하십시오. <%
문자열 path = request.getContextPath ();
String BasePath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerport ()+path+"/";
%>
<img name = "pic"src = "<%= basepath+"servlet/downloadAsStream "%>"/>
끝내십시오.
두 번째 방법 :
전체 프로세스는 4 단계로 나뉩니다. Oracle 데이터베이스에 연결 -> Blob 이미지 필드 읽기 -> 이미지 스케일링 -> JSP 페이지의 이미지 표시.
코드 사본은 다음과 같습니다. import java.sql.*;
java.io.*;
import javax.imageio.imageio;
java.awt.image.bufferedimage import;
java.awt.image.affinetransformop import;
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 () {
노력하다{
// 사용자 이름 + 비밀번호; 아래에 사용 된 테스트는 Oracle의 테이블 스페이스입니다
// 구성 파일에서 데이터베이스 정보를 읽습니다
getpara oogetpara = 새로운 getpara ();
String Strip = Ogetpara.getPara ( "ServerIP");
문자열 strport = oogetpara.getpara ( "포트");
문자열 strdbname = oogetpara.getpara ( "dbname");
문자열 struser = oogetpara.getpara ( "사용자");
문자열 strpassword = oogetpara.getpara ( "비밀번호");
this.strtabname = oogetpara.getpara ( "tablemename");
this.stridName = oogetpara.getpara ( "imgidname");
this.strimgname = oogetpara.getpara ( "imgname");
String oracleurltoconnect = "jdbc : oracle : thin :@"+strip+":"+strport+":"+strdbname;
this.myConnection = DriverManager.getConnection (OracleUrlToconnect, Struser, Strpassword);
} catch (예외) {
System.out.println ( "연결을 얻을 수 없음 :" + ex.getMessage ());
System.out.println ( "구성 파일의 데이터베이스 정보가 올바른지 확인하십시오.");
}
이것을 반환하십시오 .MyConnection;
}
}
2. Blob 필드를 읽으십시오
OracleQueryBean 클래스에 함수를 추가하십시오.
코드 사본은 다음과 같습니다. public byte [] getimgbytebyid (String strid, int w, int h) {
//system.out.println("get img 데이터 id 인 " + nid);
if (myConnection == null)
this.getConnection ();
바이트 [] data = null;
노력하다 {
문자 stmt = myConnection.createstatement ();
resultSet myResultset = stmt.executeQuery ( " + this.stridname +"에서 " + this.stridName +"를 선택하십시오.
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);
데이터 = 새로운 바이트 [nsize];
instream.Read (데이터);
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. 사진을 확대하십시오
이미지의 크기는 일치하지 않을 수 있지만 페이지의 출력 크기를 통합해야하므로 특정 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다. private byte [] changeimgsize (byte [] data, int nw, int nh) {
바이트 [] newData = null;
노력하다{
bufferedImage bis = imageio.Read (new ByTearRayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
이중 SX = (이중) NW / W;
이중 SY = (이중) NH / H;
Affinetransform transform = new affinetransform ();
transform.settoscale (sx, sy);
affinetransformop ato = 새로운 아파니 트랜스포 모프 (Transform, null);
// 원래 색상
BufferedImage Bid = New 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. 페이지에 표시하십시오. OracleQueryBean을 사용하여 사용자가 제공 한 이미지 ID를 쿼리하십시오.
다음과 같이 코드를 복사하십시오.
<jsp : usebean id = "orclequery"scope = "page" />
<%
Response.setContentType ( "image/jpeg");
// 데이터베이스에서 이미지의 ID
문자열 strid = request.getParameter ( "id");
// 썸네일 또는 그림의 너비를 확대합니다
문자열 strwidth = request.getParameter ( "w");
// 그림의 높이를 축소하거나 확대합니다
문자열 strheight = request.getParameter ( "h");
바이트 [] data = null;
if (strid! = null) {
int nwith = integer.parseint (strwidth);
int nheight = integer.parseint (stheight);
// 이미지의 바이트 데이터를 가져옵니다
data = orclequery.getimgbytebyid (strid, nwith, nheight);
servletoutputStream op = response.getOutputStream ();
op.write (data, 0, data.length);
op.close ();
op = null;
응답 .FlushBuffer ();
// 출력 스트림을 지우려면 릴리스 중 예외 캡처를 방지합니다.
out.clear ();
out = pagecontext.pushbody ();
}
%>
5. OracleQueryBean Query 클래스의 전체 코드
OracleQueryBean.java 파일 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다. import java.sql.*;
java.io.*;
import javax.imageio.imageio;
java.awt.image.bufferedimage import;
java.awt.image.affinetransformop import;
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 () {
노력하다{
// 사용자 이름 + 비밀번호; 아래에 사용 된 테스트는 Oracle의 테이블 스페이스입니다
// 구성 파일에서 데이터베이스 정보를 읽습니다
getpara oogetpara = 새로운 getpara ();
String Strip = Ogetpara.getPara ( "ServerIP");
문자열 strport = oogetpara.getpara ( "포트");
문자열 strdbname = oogetpara.getpara ( "dbname");
문자열 struser = oogetpara.getpara ( "사용자");
문자열 strpassword = oogetpara.getpara ( "비밀번호");
this.strtabname = oogetpara.getpara ( "tablemename");
this.stridName = oogetpara.getpara ( "imgidname");
this.strimgname = oogetpara.getpara ( "imgname");
String oracleurltoconnect = "jdbc : oracle : thin :@"+strip+":"+strport+":"+strdbname;
this.myConnection = DriverManager.getConnection (OracleUrlToconnect, Struser, Strpassword);
} catch (예외) {
System.out.println ( "연결을 얻을 수 없음 :" + ex.getMessage ());
System.out.println ( "구성 파일의 데이터베이스 정보가 올바른지 확인하십시오.");
}
이것을 반환하십시오 .MyConnection;
}
public byte [] getimgbytebyid (문자열 strid, int w, int h) {
//system.out.println("get img 데이터 id 인 " + nid);
if (myConnection == null)
this.getConnection ();
바이트 [] data = null;
노력하다 {
문자 stmt = myConnection.createstatement ();
resultSet myResultset = stmt.executeQuery ( " + this.stridname +"에서 " + this.stridName +"를 선택하십시오.
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);
데이터 = 새로운 바이트 [nsize];
instream.Read (데이터);
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("get img 데이터 id 인 " + nid);
if (myConnection == null)
this.getConnection ();
바이트 [] data = null;
노력하다 {
Statement stmt = myConnection.CreatEstatement ();
resultSet myResultset = stmt.executeQuery ( " + this.stridname +"에서 " + this.stridName +"를 선택하십시오.
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 (데이터);
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) {
바이트 [] newData = null;
노력하다{
bufferedImage bis = imageio.Read (new ByTearRayInputStream (data));
int w = bis.getWidth ();
int h = bis.getheight ();
이중 SX = (이중) NW / W;
이중 SY = (이중) NH / H;
Affinetransform transform = new affinetransform ();
transform.settoscale (sx, sy);
affinetransformop ato = 새로운 아파니 트랜스포 모프 (Transform, null);
// 원래 색상
BufferedImage Bid = New 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를 반환합니다.
}
}
아래는 다음과 같이 읽기 Blob 이미지를 저장하기위한 사례 복사 코드입니다. import java.sql.*;
java.io.*;
공개 클래스 insertPhoto {
public static void main (string [] 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);
문자열 sql = "사진에 삽입 (사진, 광자 이름) 값 (?,?)";
preadstatement pstmt = con.preparestatement (SQL);
pStmt.setBinaryStream (1, fis, (int) f.length ());
PSTMT.SETSTRING (2, "테스트 사진");
pstmt.executeupdate ();
fis.close ();
pstmt.close ();
con.close ();
}
}
코드 사본은 다음과 같습니다. import java.awt.image.bufferedimage;
import java.io.bufferedInputStream;
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputStream;
java.sql.connection 가져 오기;
Java.SQL.DriverManager 가져 오기;
java.sql.resultset import;
java.sql.sqlexception 가져 오기;
java.sql.statement import;
import javax.imageio.imageio;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegimageencoder;
공개 클래스 readphoto 확장 httpservlet {
개인 정적 최종 최종 긴 SerialversionUID = 1L;
public void doget (httpservletrequest request, httpservletresponse 응답) {
if (request.getParameter ( "id")! = null) {
Response.setContentType ( "image/jpeg");
노력하다 {
inputStream은 = 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)은 classNotFoundException, sqlexception {
문자열 sql = "id ="+id 위치 사진에서 사진을 선택하십시오.
연결 con = null;
문자 stmt = null;
resultSet 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);
if (rs.next ())
결과 = 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-name> genimage </servlet-name>
<Servlet-class> readphoto </servlet-class>
</servlet>
<서블릿 맵핑>
<Servlet-name> genimage </servlet-name>
<Url-pattern>/genimage </url-pattern>
</servlet-mapping>
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.