BLOB 사용 예제

프로그래밍|2008. 12. 31. 17:30


저장하기

package BLOB;

import java.io.*;
import java.sql.*;
import java.util.*;

public class Exam_07 {
 public static void main(String[] args) throws IOException {
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   System.out.println("드라이버 검색 성공");
  }catch(ClassNotFoundException e) {
   System.err.println("error = " + e);
   System.exit(1);
  }
  Connection conn = null;
  PreparedStatement pstmt = null;
  String url = "jdbc:oracle:thin:@localhost:1521:kyu";
  String id = "scott";
  String pass = "tiger";
  String query = null;
  try {
   conn = DriverManager.getConnection(url, id, pass);
  }catch(SQLException e) {
   System.err.println("sql error = " + e);
   System.exit(1); // 비정상 종료시 사용되는 함수이다.
  }
  
  Scanner sc = new Scanner(System.in);
  System.out.print("업로드 할 파일 = ");
  String filename = sc.next();
  File f = new File(filename);
  if(!f.exists()) {
   System.out.println("파일이 존재 하지 않습니다.");
   System.exit(1);
  }
  
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  FileInputStream fis = new FileInputStream(f);
  while(true) {
   int x = fis.read();
   if(x == -1) break;
   bos.write(x);
  }
  fis.close();
  bos.close(); 
  ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
  
  query = "insert into filetable values (1, ?, ?)";
  try {
   pstmt = conn.prepareStatement(query);
   pstmt.setString(1, f.getName());
   pstmt.setBinaryStream(2, bis, bos.size());
   pstmt.executeUpdate();
   System.out.println("업로드 성공!");
   pstmt.close();
   conn.close();
  }catch(SQLException e) {
   System.err.println("sql error = " + e);
  }
 }
}




불러오기

package BLOB;

import java.io.*;
import java.util.*;
import java.sql.*;
public class Exam_08 {
 public static void main(String[] ar) throws IOException {
  try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
   System.out.println("드라이버 검색 성공");
  }catch(ClassNotFoundException e) {
   System.err.println("error = " + e);
   System.exit(1);
  }
  Connection conn = null;
  PreparedStatement pstmt = null;
  String url = "jdbc:oracle:thin:@localhost:1521:kyu";
  String id = "scott";
  String pass = "tiger";
  String query = null;
  try {
   conn = DriverManager.getConnection(url, id, pass);
  }catch(SQLException e) {
   System.err.println("sql error = " + e);
   System.exit(1); // 비정상 종료시 사용되는 함수이다.
  }
  
  Scanner sc = new Scanner(System.in);
  System.out.print("다운로드 할 번호 = ");
  int num = sc.nextInt();
  
  query = "select * from filetable where num = ?";
  try {
   pstmt = conn.prepareStatement(query);
   pstmt.setInt(1, num);
   ResultSet rs = pstmt.executeQuery();
   if(rs.next()) {
    String filename = rs.getString("filename");
    System.out.println("파일명 : " + filename);
    Blob blob = rs.getBlob("filedata");
    InputStream is = blob.getBinaryStream();
    while(true) {
     int x = is.read();
     if(x == -1) break;
     System.out.print((char)x);
    }
    is.close();    
   }
   else {
    System.out.println("찾는 번호는 없습니다.");
   }
   rs.close();
   pstmt.close();
   conn.close();
  }catch(SQLException e) {
   System.err.println("sql error = " + e);
  }
 }
}


테이블 스크립트

CREATE TABLE filetable
(
    num          NUMBER,
    filename    VARCHAR2(20),
    filedata      BLOB
)



* blob으로 저장시 한가지 문제점이 발생
  java.sql.SQLException: ORA-01460: 요구된 변환은 실행될 수 없습니다. 

 - 오라클 드라이버 버전이 맞지 않아서 생긴 오류
 - ojdbc14.jar --> ojdbc14_g.jar 로 변경



 

댓글()