Day 9: Menyimpan Gambar Dalam Database


Learning In HomeOriginal Date: 21 Januari 2009

Hari ini aku akan belajar menggunakan salah satu jenis data LOB, yaitu BLOB, untuk menyimpan file gambar ke dalam database. Di versi Oracle sebelum 10g, batas maksimal sebuah LOB adalah 2^32 byte atau 4 GB. Sementara mulai Oracle 10g, ukuran sebuah LOB tidak terbatas tergantung kemampuan storage.

Untuk bisa menyimpan isi file gambar ke dalam sebuah tabel, aku harus memperoleh locator BLOB-nya terlebih dahulu. Dengan demikian, aku harus membuat sebuah record baru, kemudian men-select record tersebut untuk mendapatkan locator-nya, dan menulis melalui locator yang diperoleh. Ini adalah contohnya:


psInsert.setString(1, idGambar);
psInsert.execute();

psSelect.setString(1, idGambar);
OracleResultSet rs = (OracleResultSet)
  psSelect.executeQuery();
rs.next();

Untuk melakukan select terhadap baris yang mengandung BLOB, aku harus melakukan locking terhadap baris tersebut terlebih dahulu. Itu sebabnya aku memakai SElECT FOR UPDATE seperti ini:


SELECT GAMBAR FROM DATA_GAMBAR
WHERE ID_NO = ? FOR UPDATE

Selain itu, aku juga mematikan modus auto-commit dan melakukan commit secara manual:


cn.setAutoCommit(false);

Berikut ini adalah contoh kode yang memanfaatkan locator dan menulis ke field BLOB melalui stream:


BLOB blob = (BLOB)
  rs.getObject(1);
OutputStream os =
  blob.setBinaryStream(1l);

FileInputStream fis = new
  FileInputStream(fileGambar);

int size = blob.getBufferSize();
byte[] buffer = new byte[size];
int length = -1;
while (
  (length=fis.read(buffer)
  )!=-1) {
  os.write(buffer,0,length);
}

fis.close();
os.close();
cn.commit();

Aku tinggal melakukan hal yang kebalikan dari menulis untuk membaca data BLOB, seperti pada kode berikut:


psSelect.setString(1, idGambar);
OracleResultSet rs = (OracleResultSet) psSelect.executeQuery();
rs.next();

BLOB blob = (BLOB) rs.getObject(1);
InputStream is = blob.getBinaryStream(1l);

Setelah mendapat InputStream, aku bisa memakainya untuk melakukan manipulasi berdasarkan data BLOB yang aku peroleh, misalnya menggunakan ImageIO untuk menerjemahkan data gambar tersebut kemudian menampilkannya di sebuah JPanel.

Selain menyimpan gambar ke dalam database, Oracle Database juga memungkinkan programmer untuk menyimpan locator yang merujuk ke sebuah file di dalam database. Isi dari file tidak disimpan ke dalam database, melainkan tetap menjadi tanggungan dari file system milik OS. Hal ini dapat dicapai dengan tipe data BFILE. Berikut ini adalah contoh sederhana:


CREATE OR REPLACE DIRECTORY
  DIR_GAMBAR AS
'C:\gambar';

CREATE TABLE DATA_GAMBAR_2 (
  ID_GAMBAR VARCHAR2(30),
  LOKASI_GAMBAR BFILE
);

INSERT INTO DATA_GAMBAR_2 VALUES ('GBR1',
  bfilename('DIR_GAMBAR',
            'Fire Power.jpg'));
INSERT INTO DATA_GAMBAR_2 VALUES ('GBR2',
  bfilename('DIR_GAMBAR',
             'Me.jpg'));

Aku memasukkan data ke dalam field BFILE dengan bantuan fungsi BFILENAME yang meminta parameter berupa nama object directory dan nama file dalam directory tersebut. Untuk membaca file dari BFILE, aku menggunakan kode yang seperti berikut ini:


BFILE bfile = rs.getBFILE(1);
if (bfile.fileExists()) {
  bfile.openFile();
  pnlGambar.setImage(
    bfile.getBinaryStream());
  pnlGambar.repaint();
} else {
  System.out.println(
    "File tidak ditemukan!");
}

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: