태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

eternally full with hope...

블로그 이미지
영원히 희망으로 가득하길...
by eternalbleu
  • 464618Total hit
  • 101Today hit
  • 316Yesterday hit

'CS&E/Database'에 해당되는 글 3건

  1. 2007/05/31
    JSP를 이용해서 오라클 BLOB 다루기 (1)
  2. 2006/09/16
    64bit 데비안 리눅스에서 오라클을 설치하면서...
  3. 2006/05/13
    MySQL 코드셋 변경

1. JSP 를 이용한 BLOB 저장

-------------------------------------------------------------------------
File            file       = (File) param.get("sajin"); // 등록할 File
Blob            emptyBlob  = null;           
OutputStream    outstream  = null;
FileInputStream finstream  = null;
ResultSet rs = null;

try{
    // EMPTY_BLOB() 처리
    sql = "update table set sajin=EMPTY_BLOB() where id=?";
    ps = con.prepareStatement(sql);
    ps.setString(1, (String)param.get("id"));
    if ( ps.executeUpdate() < 0 ) throw new Exception();


    // 저장할 sajin Column 가져온다.
    sql = "select sajin from table where id=?";
    ps = con.prepareStatement(sql);
    ps.setString(1, (String)param.get("id"));
    rs = ps.executeQuery();
    if ( rs.next() ) emptyBlob = rs.getBlob(1);

    // db blob output stream
    oracle.sql.BLOB bol = (oracle.sql.BLOB) emptyBlob;
    outstream = bol.getBinaryOutputStream();
    int size = bol.getBufferSize();
    // 파일 input stream
    finstream = new FileInputStream(file);

   
    // 파일 읽어서 db에 넣기
    byte[] buffer = new byte[size];
    int length = -1;
    while ((length = finstream.read(buffer)) != -1) {
        outstream.write(buffer, 0, length);
    }
} catch (Exception e){
    throw(e);
} finally {
    if( rs          != null ) rs.close();
    if( finstream   != null ) finstream.close();              
    if( outstream   != null ) outstream.close();
}

-------------------------------------------------------------------------
즉, 다른 타입처럼 update문이나 insert를 이용하지 않는다.
다시 한번 정리하면, insert할 column을 EMPTY_BLOB()로 초기화
초기화된 column을 select 하여 OutputStream을 통해 file을 DB에 저장한다.


2. JSP 를 이용한 BLOB 브라우저에서 보기

-------------------------------------------------------------------------
package showImage;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class ShowImageServlet extends HttpServlet
{

 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {

        Connection con       = null;
        ResultSet rs         = null;
        PreparedStatement ps = null;
        InputStream is       = null;

        // Image를 가져오기위한 키값들
        String key1 = request.getParameter("key1"); // Primary key 1
        String key2 = request.getParameter("key2"); // Primary key 2
       
        String file_type    = null; // Image 파일 타입
        String content_type = null; // Image 보여주기위한 Content_type

        // Image 가져올 SQL
        final String SQL =
                " SELECT image_type, image                       " +
                "   FROM cu_basic_t                              " +
                "  WHERE key1 = '"+key1+"' AND key2 = '"+key2+"' ";


        try {
            con = UtilDB.getConnection();     // DB 연결
            ps  = con.prepareStatement(SQL);
            rs  = ps.executeQuery();          // SQL 실행

            // Image 가져오는 부분(content type도 정해준다.)
      if (rs!=null && rs.next()){

       file_type = rs.getString("image_type");
    is = rs.getBinaryStream("image");

    if (file_type.toUpperCase().equals("JPG"))      file_type = "jpeg";
    else if (file_type.toUpperCase().equals("GIF")) file_type = "gif";

    content_type = "image/" + file_type;    // "image/jpeg"나 "image/gif"
    response.setContentType(content_type);  // Content Type Set

                // Image를 Stream을 통해 out
    ServletOutputStream os = response.getOutputStream();
    int binaryRead;
    while ((binaryRead = is.read()) != -1)
    {
     os.write(binaryRead);
    }

   } else {
       throw new Exception("사진이 없습니다.");
   }
  }
  catch(ServletException e) {
      e.printStackTrace();
      throw e;
  }catch(IOException e) {
      e.printStackTrace();
      throw e;
  }
  catch(Exception e) {
      System.out.println("An error occurs : " + e.toString());
      e.printStackTrace();
  }
  finally {
      UtilDB.closeConnection(con, ps, rs); // DB 닫아준다.
  }
 }
}
package showImage;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class ShowImageServlet extends HttpServlet
{

 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {

        Connection con       = null;
        ResultSet rs         = null;
        PreparedStatement ps = null;
        InputStream is       = null;

        // Image를 가져오기위한 키값들
        String key1 = request.getParameter("key1"); // Primary key 1
        String key2 = request.getParameter("key2"); // Primary key 2
       
        String file_type    = null; // Image 파일 타입
        String content_type = null; // Image 보여주기위한 Content_type

        // Image 가져올 SQL
        final String SQL =
                " SELECT image_type, image                       " +
                "   FROM cu_basic_t                              " +
                "  WHERE key1 = '"+key1+"' AND key2 = '"+key2+"' ";


        try {
            con = UtilDB.getConnection();     // DB 연결
            ps  = con.prepareStatement(SQL);
            rs  = ps.executeQuery();          // SQL 실행

            // Image 가져오는 부분(content type도 정해준다.)
      if (rs!=null && rs.next()){

       file_type = rs.getString("image_type");
    is = rs.getBinaryStream("image");

    if (file_type.toUpperCase().equals("JPG"))      file_type = "jpeg";
    else if (file_type.toUpperCase().equals("GIF")) file_type = "gif";

    content_type = "image/" + file_type;    // "image/jpeg"나 "image/gif"
    response.setContentType(content_type);  // Content Type Set

                // Image를 Stream을 통해 out
    ServletOutputStream os = response.getOutputStream();
    int binaryRead;
    while ((binaryRead = is.read()) != -1)
    {
     os.write(binaryRead);
    }

   } else {
       throw new Exception("사진이 없습니다.");
   }
  }
  catch(ServletException e) {
      e.printStackTrace();
      throw e;
  }catch(IOException e) {
      e.printStackTrace();
      throw e;
  }
  catch(Exception e) {
      System.out.println("An error occurs : " + e.toString());
      e.printStackTrace();
  }
  finally {
      UtilDB.closeConnection(con, ps, rs); // DB 닫아준다.
  }
 }
}
-------------------------------------------------------------------------
JSP 기준이다.

보여줄 JSP에 다음을 추가

<img src="/servlet/ShowImageServlet?key1=<%=key1%>&key2=<%=key12%>"

  width="100" height="100" />

SRC에 image를 보여주도록 만들어진 서블릿을 입력

참고 (서블릿 실행을 위해 WAS(Jeus) 설정법)

WEB-INF\web.xml 내에 서블릿 등록을 등록하고 서버 재 Start시킨다.


   <servlet>
      <servlet-name>ShowImageServlet</servlet-name>
      <servlet-class>showImage.ShowImageServlet</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>ShowImageServlet</servlet-name>
      <url-pattern>/ShowImageServlet</url-pattern>
   </servlet-mapping>


학교 숙제를 하면서 계속 찾았는데, 인터넷에서 찾을 수 있는 소스중에서 가장 쉽게 나왔네요. BLOB에 대한 자료가 거의 없다 시피해서... (있더라도.. 상당히 길게 늘여적은 소스가 많아서;;)

혹시 나중에 필요하신분들을 위해서 남겨놓습니다.
TRACKBACK 0 AND COMMENT 1

이번에 데이터베이스 이론을 들으면서 실제 SQL 연습을 위해서 오라클을 설치하려고 했습니다.

익히 설치가 힘들다고 여기저기에서 들어왔던 프로그램인 만큼...

리눅스에서 설치를 하기가 까다로울 것이라는 생각을 하고서 시작했는데...

역시나... 제가  운용가능한 서버가 64bit 리눅스(데비안)뿐인데... 설치가 영 쉽지가 않았습니다.

데비안 64bit 리눅스 서버에 설치를 하는 모습

일단 위와 같은 인스톨러 화면을 보는데에만 2일이라는 시간을 소모했습니다. 데비안 패키지의 선 JRE 가 32bit 애플리케이션을 구동하면 생기는 버그 때문에 인스톨러가 로케일을 인식을 못하더군요.

구글에서 구글링을 해서 결국 해결법을 찾고 인스톨러를 띄우기는 했는데...

각 컴포넌트를 연결하는 과정에서 make 에러발생 ㅡㅡ;;

GG 하고 윈도우에 설치했습니다.

하고 보니 윈도우에서는 한방에 설치 완료.;;;

완전 허무하네요.


TRACKBACK 0 AND COMMENT 0
/etc/my.cnf
[client]default-character-set=utf8[mysqld]default-character-set=utf8[mysqldump]default-character-set=utf8

JDBC Driver URL
jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=UTF8

현제 문자셋 정보 보기
show variables like 'c%';- 결과

character_set_client : utf8character_set_connection : utf8character_set_database : utf8character_set_results : utf8character_set_server : utf8character_set_system : utf8character_sets_dir : /usr/share/mysql/charsets/collation_connection : utf8_general_cicollation_database : utf8_general_cicollation_server : utf8_general_ci

이미 생성된 DATABASE의 문자셋 바꾸기
mysql> SET character_set_client = utf8;mysql> SET character_set_results = utf8;mysql> SET character_set_connection = utf8;mysql> ALTER DATABASE [DB명] DEFAULT CHARACTER SET utf8;

이미 데이터가 들어간 테이블의 문자셋 변환
create table test (merong varchar(20) collate latin1_general_ci);이렇게 만들어진 테이블에 한글 데이터를 넣은 후 필드를 euckr 로 변경하려면다음처럼 해야 합니다.alter table test modify merong binary(100);alter table test modify merong varchar(20) collate euckr_korean_ci;binary 로 바꾸면 문자셋 특성이 사라지기 때문에 이런 변환과정을 거쳐야합니다(메뉴얼에 의하면). 그냥 바꾸면 문자들이 손상됩니다.참고글기존 EUC-KR 데이타를 4.1.x로 옮기기
참고글
TRACKBACK 0 AND COMMENT 0

ARTICLE CATEGORY

분류 전체보기 (782)
Re: myself (441)
Favorite things (241)
CS&E (71)
Portfolio (22)
삼성SDS (0)

CALENDAR

«   2008/07   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

ARCHIVE