1. Pendahuluan
Saat membangun aplikasi berbasis data, seringkali diperlukan untuk menangkap data teks dan biner. Program semacam itu mungkin perlu menyimpan gambar, PDF, file Word, atau data biner lainnya. Ada dua cara untuk menyimpan data biner ini: di sistem file server web dan menambahkan referensi ke file terkait di database atau langsung di database itu sendiri;
Data tekstual seperti string, angka, tanggal, GUID, nilai moneter, dll. - memiliki definisi tipe data yang sesuai dan sesuai dalam sistem database. Misalnya, di Microsoft SQL Server, Anda bisa menggunakan tipe data int untuk menyimpan nilai integer; dan untuk menyimpan nilai string, Anda bisa menggunakan tipe varchar atau nvarchar. Selain itu, database juga menyediakan definisi tipe untuk menyimpan data biner. Di Microsoft SQL SERVER 2000 dan versi sebelumnya, tipe data gambar digunakan untuk menyimpan data biner; di SQL SERVER 2005, tipe data varbinary (MAX) digunakan. Tipe data ini mampu menyimpan data biner hingga ukuran 2 GB menggunakan salah satu dari dua metode di atas.
Namun, saat menyimpan data biner secara langsung di database, diperlukan beberapa pekerjaan tambahan untuk memasukkan, memperbarui, dan mengambil data biner. Untungnya, kita dapat mengabstraksi operasi T-SQL tingkat rendah yang kompleks ini melalui pustaka akses data tingkat tinggi - seperti ADO.NET - sehingga masalahnya menjadi cukup sederhana. Namun, bekerja dengan data biner melalui ADO.NET sedikit berbeda dengan bekerja dengan data teks. Pada artikel ini, kita akan menganalisis cara menggunakan ADO.NET dan kontrol ASP.NET 2.0 SqlDataSource untuk menyimpan dan mengambil file gambar langsung dari database. Silakan baca terus!
2. Perbandingan antara menyimpan data dalam database dan menyimpannya dalam sistem file
Seperti yang baru saja diperkenalkan, ketika menangkap data biner dalam suatu aplikasi, data biner dapat disimpan langsung dalam database atau sebagai file di server sistem file - hanya referensi ke file dalam database yang dipertahankan. Dalam pengalaman saya, saya telah menemukan bahwa sebagian besar pengembang lebih suka menyimpan data biner dalam sistem file, terutama karena alasan berikut:
· Dibutuhkan lebih sedikit usaha - Menyimpan dan mengambil biner yang disimpan dalam database memerlukan lebih banyak upaya pengkodean. Selain itu, memperbarui data biner ini akan lebih mudah - tidak perlu berkomunikasi dengan database, cukup memodifikasi file secara langsung!
· URL yang menunjuk ke file lebih langsung - Seperti yang akan kita lihat di artikel ini, untuk menyediakan akses ke data biner yang disimpan dalam database, kita perlu membuat halaman ASP.NET lain yang dapat mengembalikan data tersebut. Biasanya, pengidentifikasi unik yang sesuai dengan catatan terkait dalam database (mengembalikan data binernya) diteruskan ke halaman ini. Hasilnya adalah untuk mengakses data biner - katakanlah gambar yang diunggah - URL-nya terlihat seperti http://www.yourserver.com/ShowImage.aspx?ID=4352 , sedangkan jika gambar disimpan langsung di file In sistem, URL akan lebih langsung - misalnya http://www.yourserver.com/UploadedImages/Sam.jpg.
· Dukungan alat yang lebih baik untuk menampilkan gambar - Jika Anda menggunakan ASP.NET 2.0, Anda dapat menggunakan kontrol ImageField di kontrol GridView atau DetailsView untuk menampilkan gambar (jalur gambarnya disimpan dalam database). Namun sayangnya, ImageField ini tidak dapat langsung menampilkan data gambar di database (karena memerlukan kueri halaman eksternal dan mengembalikan data terkait).
· Kinerja - Karena file biner disimpan di sistem file server web daripada di database, aplikasi dapat mengakses lebih sedikit data di database, sehingga mengurangi persyaratan pada database dan dengan demikian mengurangi persyaratan di web dan kemacetan jaringan antara server basis data.
Keuntungan utama menyimpan data secara langsung dalam database adalah membuat data menjadi "mandiri". Sekarang semua data terdapat dalam database, dukungan data, perpindahan data antar server database, replikasi database, dll. jauh lebih mudah karena tidak perlu khawatir tentang menyalin atau membuat cadangan konten biner yang disimpan dalam sistem file pertanyaan.
Seperti biasa, solusi penyimpanan mana yang dipilih akan bergantung pada lokasi penggunaan aktual dan kebutuhan bisnis. Misalnya, saya mengembangkan klien yang data binernya harus disimpan dalam database karena perangkat lunak pelaporan yang mereka gunakan hanya mampu memasukkan data biner ke dalam laporan - jika berasal dari database. Dalam kasus lain, seorang kolega saya sedang mengerjakan sebuah proyek di mana biner perlu digunakan oleh aplikasi web dan tersedia melalui FTP, dalam hal ini data biner perlu disimpan dalam sistem file.
3. Membuat tabel database untuk menyimpan data biner
Sisa artikel ini akan menganalisis aplikasi galeri gambar ASP.NET 2.0 sederhana yang saya tulis menggunakan Microsoft SQL Server 2005 Express Edition untuk mendemonstrasikan Konsep langsung terkait penyimpanan dan pengambilan data biner dalam sebuah basis data.
Model data aplikasi galeri gambar ini terdiri dari tabel - Gambar, dimana setiap record berhubungan dengan gambar di galeri. Bidang MIMEType pada tabel Gambar ini menyimpan tipe MIME dari gambar yang diunggah (gambar/jpeg untuk file JPG, gambar/gif untuk file GIF, dll.); tipe MIME di sini menentukan kepada browser cara menghasilkan data biner. Kolom ImageData menyimpan konten biner sebenarnya dari gambar.
4. Upload gambar dan simpan data biner menggunakan kode ADO.NET
Galeri gambar ini memungkinkan pengunjung untuk mengunggah file gambar (format GIF, JPG dan PNG) ke dalam aplikasi ini. Setelah diunggah, catatan baru ditambahkan ke tabel Gambar dan konten file gambar disimpan di kolom ImageData catatan baru. Untuk mengunggah file dari browser web ke server web di ASP.NET 2.0, kontrol FileUpload digunakan dalam contoh ini. Menggunakan kontrol FileUpload sangat sederhana - cukup seret dari toolbar ke halaman Anda. Pada akhirnya, kontrol FileUpload ini akan dihasilkan di browser pengguna sebagai bentuk unggahan file standar - tombol "Jelajahi" (bila diklik) memungkinkan pengguna memilih file dari hard drive mereka untuk diunggah ke server web.
Misalnya, untuk membuat antarmuka untuk menambahkan gambar baru, saya menggunakan kontrol TextBox untuk mengambil judul gambar, dan kontrol FileUpload untuk memungkinkan pengguna menentukan gambar yang akan diunggah:
<b>Judul:</b>
<asp:TextBox ID="PictureTitle" runat="server" />
<br />
<b>Gambar:</b>
<asp:FileUpload ID="UploadedFile" runat="server" />
<br />
<asp:LinkButton ID="btnInsert" runat="server" Text="Sisipkan" />
Kode di atas membuat halaman di mana pengguna dapat menentukan file dari hard drive mereka untuk diunggah ke server web.
Setelah pengguna memilih file dan mengirimkan formulir (misalnya, dengan mengklik tombol "Sisipkan"), konten biner dari file tertentu dikirim ke server web. Dari kode sisi server, data biner ini tersedia melalui properti PostedFile.InputStream dari kontrol FileUpload, seperti yang ditunjukkan oleh markup dan kode berikut:
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert . Klik
'Pastikan file berhasil diunggah
Jika UploadedFile.PostedFile Bukan Apa-apa OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream Bukan Apa-apa, Maka
...menampilkan pesan kesalahan...
Keluar dari Sub
Akhiri Jika
'Pastikan kami bekerja dengan file JPG atau GIF
Redupkan ekstensi As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Redupkan MIMEType Sebagai String = Tidak Ada
Pilih Ekstensi kasus
Kasus ".gif"
MIMEType = "gambar/gif"
Kasus ".jpg", ".jpeg", ".jpe"
MIMEType = "gambar/jpeg"
Kasus ".png"
MIMEType = "gambar/png"
Kasus Lain
'Unggahan jenis file tidak valid... pesan kesalahan ditampilkan...
Keluar dari Sub
Akhir Pilih
'Hubungkan ke database dan masukkan catatan baru ke dalam tabel Produk
Menggunakan myConnection Sebagai SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "MASUKKAN KE [Gambar] ([Judul], [MIMEType], [ImageData]) NILAI (@Judul, @MIMEType, @ Data Gambar)"
Redupkan myCommand Sebagai SqlCommand Baru (SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'Muat InputStream dari kontrol FileUpload ke dalam array byte
Redupkan imageBytes (UploadedFile.PostedFile.InputStream.Length) Sebagai Byte
UploadedFile.PostedFile.InputStream.Baca(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
Koneksi saya.Buka()
Perintahku.ExecuteNonQuery()
Koneksi saya.Tutup()
Akhiri Penggunaan
Akhiri
SubHere, event handler ini terlebih dahulu memastikan bahwa file telah diunggah. Kemudian menentukan jenis MIME berdasarkan ekstensi file yang diunggah.
Bagian yang paling penting di atas adalah bagian kode yang menetapkan parameter @ImageData. Pertama, buat array byte bernama imageBytes dan buat panjangnya sesuai dengan InputStream dari file yang sedang diunggah. Kemudian, gunakan metode Baca dari InputStream untuk mengisi konten biner ke dalam array byte ini. Perhatikan bahwa array byte inilah yang ditentukan sebagai nilai @ImageData.