Berbeda dengan tipe data lain non BLOB yang bisa langsung terbaca dengan membuka Datasheet view dari sebuah tabel, tipe data BLOB tidak bisa dibaca dengan cara itu. Dengan membuka Datasheet view tabel yang berisi data BLOB, kita hanya akan melihat sebuah tulisan Long Binary Data tanpa mengetahui bagaimana bentuk data yang sebenarnya adalah sebuah file.
Di MS Access, semua data BLOB, bila disimpan ke dalam sebuah tabel hanya ada tulisan Long Binary Data. Kita tidak bisa tahu seperti apakah bentuknya. Sebagai contoh, lihat gambar di bawah ini, Datasheet view tabel tblBlob. Pada tabel itu, terdapat berbagai macam file. Bila kolom non BLOB data seperti blobMeta, blobNamaFile, blobNamaEkstensi, blobUkuran, dan blobDeskripsi dihilangkan, maka kita tidak akan tahu jenis file apa yang ada didalamnya.
Gambar 1. Field/kolom blobData yang berisi data BLOB berupa file |
Di sinilah letak pentingnya kolom atau field non-BLOB, seperti yang telah dibuat sebelumnya pada posting yang berjudul Mengenal Tipe Data BLOB di MS Access, yaitu untuk memberikan informasi yang relevan dengan data BLOB itu sendiri. Dengan mengetahui jenis file yang ada dalam field dengan tipe data BLOB, kita bisa memberi semacam perlakuan untuk mengkonversi file sesuai dengan jenisnya, sehingga data BLOB itu bisa terbaca.
Cara membaca data BLOB
Supaya data BLOB bisa terbaca, maka kita harus mentransfer data BLOB menjadi sebuah file. File itu akan disimpan sementara. Bila tidak dipergunakan lagi, kita bisa menghapusnya dengan tujuan untuk menghemat pemakaian media penyimpanan. File sementara itu disimpan di direktori sementara. Tujuannya, selain untuk menjaga kerahasiaan, juga untuk menghemat trafik jaringan. Setelah menjadi file, kita dapat membukanya dengan aplikasi yang sesuai.
Gambar 2. Data BLOB berupa file gambar (atas dan bawah) |
Berikut ini adalah cara membaca data BLOB. Sebagai percobaan, kita akan menggunakan form frmBLOB yang telah dibuat sebelumnya di posting yang berjudul Menyimpan Data Tipe BLOB di MS Access.
- Bukalah Design View dari form frmBlob.
- Pada bagian Form Header, sisipkanlah text box dan tombol perintah dengan rincian properti sebagai berikut:
- Text box, Name= txtKriteria
- Button (Form Control), Name= cmdTampilkan, Caption= Tampilkan
- Button (Form Control), Name= cmdGanti, Caption= Ganti File yang Sudah Ada
- Pada bagian Form Detail, sisipkan sebuah tombol perintah dengan properti sebagai berikut: Name= cmdBukaFile, Caption= Buka File.
- Masih pada bagian Form Detail, sorotlah control yang bernama blobData. Aturlah properti Control Source menggunakan expression builder sehigga properti Control Source= =namaPathFile([blobid]). Control Source ini berisi fungsi namaPathFile yang diambil dari modul mdlBlobBaca.
- Pada bagian Form Footer, sisipkan sebuah tombol perintah dengan properti sebagai berikut: : Name= cmdBersihkan, Caption= Bersihkan File Temporer. Tujuannya untuk menghapus file yang tidak perlu, sehingga bisa menghemat pemakaian media penyimpanan.
Gamber 3. Data BLOB berupa file di-zip yang dibuka dengan MS Access |
Design form frmBlob yang sudah diperbaharui bisa dilihat pada gambar di bawah ini.
Gambar 3. Form design dari frmBlob yang sudah diperbaharui |
Berikut ini adalah kode VBA yang ada di modul form Form_frmBlob. Modul Form_frmBlob adalah modul yang ada di posting Menyimpan Data Tipe BLOB di MS Access (link di atas) dan telah diperbaharui sejalan dengan penambahan beberapa control tersebut di atas.
Option Compare Database Private Const constStrTableName As String = "tblBlob" Private Const constPrimaryKeyFieldName As String = "blobId" Private strLocalSql As String Private Sub cmdBersihkan_Click() bersihkanTempFile End Sub Private Sub cmdGanti_Click() Dim rs As DAO.Recordset Dim strPathFile As String Dim lngMaxSize As Long Dim oleBlobData As Variant, oleBlobBacaData As Variant Dim strKriteria As Variant Dim strSql As String If Me.blobId = 0 Then MsgBox "Tidak ada Blob Id yang teridentifikasi", vbExclamation Exit Sub End If If IsNull(Me.txtNamaFile) Then MsgBox "Tidak ada nama file teridentifikasi", vbExclamation Me.txtNamaFile.SetFocus Exit Sub End If If Me.txtNamaFile = "" _ Or Not adaNamaFile(Me.txtNamaFile) Then MsgBox "Tidak ada nama file teridentifikasi", vbExclamation Me.txtNamaFile.SetFocus Exit Sub End If strKriteria = Me.txtKriteria ' strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset) rs.Edit If CLng(simpanBlob(Me.txtNamaFile, rs, "blobObjek")) > constBlobMaxSize Then MsgBox "Ukuran file lebih besar dari yang dipersyaratkan.", vbExclamation Exit Sub End If oleBlobData = simpanBlob(Me.txtNamaFile, rs, "blobObjek") rs!blobNamaFile = uraiPathFile(Me.txtNamaFile)(0) rs!blobNamaEkstensi = uraiPathFile(Me.txtNamaFile)(2) rs!blobUkuran = CLng(oleBlobData) rs.Update rs.Bookmark = rs.LastModified Me.blobId = rs!blobId If folderTemporer = "" Then Exit Sub strPathFile = folderTemporer & rs!blobNamaFile oleBlobBacaData = bacaBlob(rs, "blobObjek", strPathFile) Me.blobNamaFile = rs!blobNamaFile Me.blobNamaEkstensi = rs!blobNamaEkstensi Me.blobUkuran = rs!blobUkuran Me.blobData.Requery rs.Close Set rs = Nothing End Sub Private Sub cmdHapus_Click() Dim strKriteria As Variant Dim strPesan As String strKriteria = Me.blobId strPesan = "Data dengan Id nomor " & strKriteria & " akan dihapus?" If MsgBox(strPesan, vbYesNo, "Hapus Data BLOB") = vbYes Then daoDbs.Execute "DELETE * FROM " & constStrTableName & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria MsgBox "Data dengan Id nomor " & strKriteria & " telah dihapus.", vbInformation Me.blobNamaFile = vbNullString Me.blobNamaEkstensi = vbNullString Me.blobUkuran = vbNullString Me.blobId = vbNullString Me.blobDeskripsi = vbNullString Me.blobMeta = vbNullString End If End Sub Private Sub cmdPilihFile_Click() Me.txtNamaFile = kotakFileDialog(Nz(Me.txtNamaFile, "")) Me.txtNamaFile.SetFocus End Sub Private Sub cmdSimpan_Click() Dim rs As DAO.Recordset Dim strKriteria As Variant Dim strSql As String Cancel = False If IsNull(Me.blobNamaFile) Then MsgBox "Tidak ada file yang disimpan.", vbExclamation Cancel = True Exit Sub End If strKriteria = Me.blobId strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset) rs.Edit rs!blobDeskripsi = Me.blobDeskripsi rs.Update rs.Close Set rs = Nothing End Sub Private Sub cmdSimpanTambahBaru_Click() cmdSimpan_Click If Not Cancel Then cmdPilihFile_Click End Sub Private Sub cmdTambahBaru_Click() cmdPilihFile_Click End Sub Private Sub cmdTampilkan_Click() Dim rs As DAO.Recordset Dim strKriteria As Variant, oleBlobBacaData As Variant Dim strSql As String, strPathFile As String If IsNull(Me.txtKriteria) Then Exit Sub strKriteria = Me.txtKriteria strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset) If adaBlobId(CLng(strKriteria)) Then Me.blobId = rs!blobId Me.blobMeta = rs!blobMeta Me.blobDeskripsi = rs!blobDeskripsi Me.blobNamaFile = rs!blobNamaFile Me.blobNamaEkstensi = rs!blobNamaEkstensi If folderTemporer = "" Then Exit Sub strPathFile = folderTemporer & Me.blobNamaFile If Not adaNamaFile(strPathFile) Then oleBlobBacaData = copyBlobObjek(strSql, strPathFile) Me.blobData.Requery Else MsgBox "Tidak ada Blob Id: " & strKriteria, vbExclamation End If rs.Close Set rs = Nothing End Sub Private Sub cmdUpload_Click() Dim rs As DAO.Recordset Dim strPathFile As String Dim oleBlobData As Variant, oleBlobBacaData As Variant If IsNull(Me.txtNamaFile) Then MsgBox "Tidak ada nama file untuk di-upload.", vbExclamation Me.txtNamaFile.SetFocus Exit Sub End If If Me.txtNamaFile = "" _ Or Not adaNamaFile(Me.txtNamaFile) Then MsgBox "Tidak ada nama file untuk di-upload.", vbExclamation Me.txtNamaFile.SetFocus Exit Sub End If Set rs = daoDbs.OpenRecordset(constStrTableName, dbOpenTable) rs.AddNew If CLng(simpanBlob(Me.txtNamaFile, rs, "blobObjek")) > constBlobMaxSize Then MsgBox "Ukuran file lebih besar dari yang dipersyaratkan.", vbExclamation Exit Sub End If oleBlobData = simpanBlob(Me.txtNamaFile, rs, "blobObjek") rs!blobNamaFile = uraiPathFile(Me.txtNamaFile)(0) rs!blobNamaEkstensi = uraiPathFile(Me.txtNamaFile)(2) rs!blobUkuran = CLng(oleBlobData) rs.Update rs.Bookmark = rs.LastModified Me.blobId = rs!blobId If folderTemporer = "" Then Exit Sub strPathFile = folderTemporer & rs!blobNamaFile oleBlobBacaData = bacaBlob(rs, "blobObjek", strPathFile) Me.blobNamaFile = rs!blobNamaFile Me.blobNamaEkstensi = rs!blobNamaEkstensi Me.blobUkuran = rs!blobUkuran Me.blobData.Requery rs.Close Set rs = Nothing End Sub Private Sub Form_Open(Cancel As Integer) strLocalSql = "SELECT * FROM " & constStrTableName Set daoDbs = CurrentDb() End Sub Private Sub cmdBukaFile_Click() If Me.blobId <> "" Or Me.blobId <> Null Then fHandleFile namaPathFile(Me.blobId), WIN_NORMAL End If End Sub
Berikut ini adalah kode VBA yang ada di form Form_frmBlobBaca. Modul ini khusus digunakan untuk membaca data BLOB.
Option Compare Database Option Explicit Const BlockSize = 32768 Function bacaBlob(T As Recordset, sField As String, _ Destination As String) Dim intNumBlocks As Integer, intDestFile As Integer, i As Integer Dim lngFileLength As Long, lngLeftOver As Long Dim strFileData As String Dim varRetVal As Variant On Error GoTo Err_bacaBlob lngFileLength = T(sField).FieldSize() If lngFileLength = 0 Then bacaBlob = 0 Exit Function End If intNumBlocks = lngFileLength \ BlockSize lngLeftOver = lngFileLength Mod BlockSize intDestFile = FreeFile Open Destination For Output As intDestFile Close intDestFile Open Destination For Binary As intDestFile varRetVal = SysCmd(acSysCmdInitMeter, _ "Writing BLOB", lngFileLength / 1000) strFileData = T(sField).GetChunk(0, lngLeftOver) Put intDestFile, , strFileData varRetVal = SysCmd(acSysCmdUpdateMeter, lngLeftOver / 1000) For i = 1 To intNumBlocks strFileData = T(sField).GetChunk((i - 1) * BlockSize _ + lngLeftOver, BlockSize) Put intDestFile, , strFileData varRetVal = SysCmd(acSysCmdUpdateMeter, _ ((i - 1) * BlockSize + lngLeftOver) / 1000) Next i varRetVal = SysCmd(acSysCmdRemoveMeter) Close intDestFile bacaBlob = lngFileLength Exit Function Err_bacaBlob: bacaBlob = -Err Exit Function End Function Function namaFile(intBlobId As Integer) As String Dim rs As DAO.Recordset Set rs = daoDbs.OpenRecordset("SELECT blobNamaFile FROM tblBlob WHERE blobId=" & intBlobId, dbOpenSnapshot) If rs.RecordCount = 0 Then namaFile = "" Else namaFile = Nz(rs.Fields("blobNamaFile").Value, "") End If rs.Close Set rs = Nothing End Function Function namaPathFile(intBlobId As Integer) As String If namaFile(intBlobId) <> "" Then namaPathFile = folderTemporer & namaFile(intBlobId) Else namaPathFile = "" End If End Function Function adaBlobId(lngBlobDataId As Long) As Boolean Dim lngBlobId As Long On Error GoTo Err_Msg lngBlobId = DCount("*", "tblBlob", "blobId=" & lngBlobDataId) adaBlobId = False If lngBlobId > 0 Then adaBlobId = True Exit_Function: Exit Function Err_Msg: MsgBox "Function adaBlobId, Error # " & str(Err.Number) & ", source: " & Err.Source & _ Chr(13) & Err.description Resume Exit_Function End Function Function bersihkanTempFile() Dim objFSO As Object, objFolder As Object Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile (folderTemporer & "*.*") Set objFSO = Nothing End Function Function copyBlobObjek(strTbl As String, strFilePath As String) As Variant 'OK Dim rst As DAO.Recordset On Error GoTo Err_Msg Set rst = daoDbs.OpenRecordset(strTbl, dbOpenSnapshot) copyBlobObjek = bacaBlob(rst, "blobObjek", strFilePath) rst.Close Set rst = Nothing Exit_Function: Exit Function Err_Msg: MsgBox "Function copyBlobObjek, Error # " & str(Err.Number) & ", source: " & Err.Source & _ Chr(13) & Err.description Resume Exit_Function End Function
Untuk memperoleh contoh aplikasi BLOB, silakan ikuti petunjuk di bawah ini:
- Follow on Facebook yang ada di kotak sebelah kanan blog Access Terapan dengan memilih Following.
- Setelah itu, kirim email ke admin a.n. bambang.subro@gmail.com untuk memperoleh akses ke Google Drive Access Terapan.
- Setelah akses diperoleh, silakan buka Googlr Drive lalu klik bagian silakan download file blobSimpanBaca.zip. File ini berisi 5 objek Access:
- Tabel yang bernama tblBlob, khusus untuk menyimpan data BLOB beserta properti/metadata
- Form yang bernama frmBlob, khusus untuk antarmuka antara user dengan tblBlob. Di dalamnya berisi class modul Frm_frmBlob.
- Tiga Modul yang bernama mdlAPI, mdlBlobSimpan, dan mdlBaca digunakan untuk memporses upload file ke dalam database di tblBlob dan menampilkannya kembali.
- Bukalah form frmBlob dalam format Form View.
- Sebagai uji coba lakukan upload file (apa saja terserah), yang penting tidak boleh melebihi batas maksimum ukuran file yang dipersyaratkan pada deklarasi konstanta Public Const constBlobMaxSize.
Perkenalkan, saya dari tim kumpulbagi. Saya ingin tau, apakah kiranya anda berencana untuk mengoleksi files menggunakan hosting yang baru?
ReplyDeleteJika ya, silahkan kunjungi website ini www.kbagi.com untuk info selengkapnya.
Di sana anda bisa dengan bebas share dan mendowload foto-foto keluarga dan trip, music, video, filem dll dalam jumlah dan waktu yang tidak terbatas, setelah registrasi terlebih dahulu. Gratis :)