5. Unggah gambar dan simpan data biner menggunakan kode kontrol sumber data ASP.NET 2.0.
Meskipun metode ADO.NET berfungsi dalam konteks aplikasi ASP.NET 2.0, Anda juga dapat menggunakan kontrol sumber data ASP.NET 2.0 untuk menyimpan biner data.Data biner disimpan ke dalam database, yang tidak mengharuskan Anda menulis kode ADO.NET. Kontrol SqlDataSource yang digunakan dalam program demo ini berisi InsertCommand dan parameter yang sesuai dengan nilai Title, MIMEType, dan ImageData:
InsertCommand="MASUKKAN KE [Gambar] ([Judul], [MIMEType], [ImageData]) NILAI (@Judul, @MIMEType, @ImageData)">
<asp:Nama Parameter="Judul" Tipe="String" />
<asp:Nama Parameter="MIMEType" Type="String" />
<asp:Nama Parameter="Data Gambar" />
</SisipkanParameter>
</asp:SqlDataSource>
Perhatikan bahwa di sini, parameter ImageData tidak menentukan tipe. Jika Anda mencoba menggunakan panduan GUI untuk membuat sintaks SqlDataSource, mungkin akan menentukan Type="Object" untuknya. Namun, Type="Object" ini akan menghasilkan parameter tipe sql_variant. Namun, tipe sql_variants tidak dapat digunakan untuk menyimpan gambar atau tipe data varbinary (MAX) karena ukuran data intrinsik sql_variant tidak boleh melebihi 8.000 byte. (Jika Anda mencoba menggunakan Type="Object" dan kemudian mencoba menyimpan data biner yang ukurannya melebihi 8.000 byte, sistem akan memunculkan pengecualian dengan pesan "Parameter '@ImageData' melebihi batas ukuran untuk tipe data sql_variant "; Jika Anda mencoba menambahkan data biner yang berukuran kurang dari 8.000 byte, pengecualian akan menampilkan pesan "Konversi implisit dari tipe data sql_variant ke varbinary(max) tidak diperbolehkan").
Selain itu, kontrol DetailsView berisi dua TemplateFields. Diantaranya, kontrol TextBox digunakan dalam satu TemplateField untuk menampilkan bilah judul; yang lainnya menggunakan kontrol FileUpload untuk mewakili bilah ImageData. Hasil akhirnya adalah antarmuka pengguna yang terlihat mirip dengan yang ada di bagian "Mengunggah gambar dan menyimpan data biner menggunakan kode ADO.NET". Ketika tombol "Sisipkan" pada DetailsView diklik, peristiwa Penyisipannya diaktifkan. Pada saat ini, data biner harus diperoleh dari kontrol FileUpload, dibaca ke dalam array byte, dan ditetapkan ke parameter yang sesuai:
Sub UploadPictureUI_ItemInserting(ByVal) yang Dilindungi (ByVal). pengirim Sebagai Objek, ByVal dan Sebagai System.Web.UI.WebControls.DetailsViewInsertEventArgs) Menangani UploadPictureUI.ItemInserting
'Referensikan kontrol FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Pastikan file telah berhasil diunggahJika UploadedFile.PostedFile Tidak Ada OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream Bukan Apa-apa
...menampilkan pesan kesalahan...
e.Batal = Benar
Keluar dari Sub
Akhiri Jika
'Pastikan kita berurusan 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...
e.Batal = Benar
Keluar dari Sub
End Select
"Tentukan nilai parameter MIMEType dan ImageData
e.Nilai("MIMEType") = MIMEType
'Muat InputStream FileUpload ke dalam array byte
Redupkan imageBytes (UploadedFile.PostedFile.InputStream.Length) Sebagai Byte
UploadedFile.PostedFile.InputStream.Baca(imageBytes, 0, imageBytes.Length)
e.Nilai("ImageData") = imageBytes
End Sub
Sama seperti event handler Click pada tombol "Sisipkan" sebelumnya, event handler Inserting pada DetailsView juga menjalankan logika yang sama - hanya ada sedikit perbedaan sintaksis. Pertama, karena kontrol FileUpload ada di dalam templat, maka kontrol tersebut harus direferensikan secara terprogram menggunakan metode FindControl("controlID") . Setelah direferensikan, pemeriksaan yang sama dilakukan untuk memastikan bahwa file berhasil diunggah dan ekstensi yang sesuai diizinkan. Sedikit perbedaan pada event handler Inserting dari DetailsView adalah jika terjadi kesalahan, maka kita perlu memberitahukan DetailsView untuk menghentikan pekerjaan penyisipan terkait - ini dicapai dengan mengatur properti e.Cancel ke True.
Setelah pemeriksaan, parameter MIMEType dan ImageData akan ditetapkan menggunakan sintaks e.Values("parameterName")=value. Sama seperti pada contoh ADO.NET sebelumnya, pertama-tama baca data biner ke dalam array byte, lalu tetapkan array byte ke parameter.
6. Menampilkan konten biner
Tidak peduli teknologi apa yang Anda gunakan untuk menyimpan data dalam database, untuk mengambil dan menampilkan data biner, kita perlu membuat halaman ASP.NET baru. Halaman bernama ShowPicture.aspx akan meneruskan PictureID ke sana melalui string kueri dan mengembalikan data biner dari bidang ImageData produk yang ditentukan. Setelah selesai, gambar tertentu dapat dilihat dengan mengunjungi alamat /ShowPicture.aspx?PictureID=picutreID. Oleh karena itu, untuk menampilkan gambar pada halaman web, kita dapat menggunakan kontrol gambar dan mengatur properti ImageUrl ke URL yang sesuai.
Perhatikan bahwa ShowPicture.aspx tidak menyertakan tag HTML apa pun di halaman .aspx-nya. Dalam event handler Page_Load dari kelas di belakang kode, kode ADO.NET akan digunakan untuk mengambil MIMEType dan ImageData dari baris Pictures yang ditentukan dari database. Kemudian, ContentType halaman disetel ke nilai bidang MIMEType, dan data biner dikeluarkan menggunakan Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me. Memuat
Redupkan PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Hubungkan ke database dan kembalikan konten gambar dan tipe MIME dari gambar yang ditentukan Menggunakan myConnection Sebagai SqlConnection Baru(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = "PILIH [MIMEType], [ImageData] DARI [Gambar] WHERE [PictureID] = @PictureID"
Redupkan myCommand Sebagai SqlCommand Baru (SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Redupkan myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Then
Respon.ContentType = myReader("MIMEType").ToString()
Respon.BinaryWrite(myReader("ImageData"))
Berakhir Jika
myReader.Close()
Koneksi saya.Tutup()
Akhiri Penggunaan
Akhiri Sub