5. อัปโหลดรูปภาพและจัดเก็บข้อมูลไบนารี่โดยใช้โค้ดควบคุมแหล่งข้อมูล ASP.NET 2.0
แม้ว่าวิธี ADO.NET จะทำงานในบริบทของแอปพลิเคชัน ASP.NET 2.0 แต่คุณยังสามารถใช้ตัวควบคุมแหล่งข้อมูล ASP.NET 2.0 เพื่อจัดเก็บไบนารี่ได้
ข้อมูลข้อมูลไบนารีจะถูกจัดเก็บไว้ในฐานข้อมูลซึ่งไม่จำเป็นต้องให้คุณเขียนโค้ด ADO.NET ตัวควบคุม SqlDataSource ที่ใช้ในโปรแกรมสาธิตนี้ประกอบด้วย InsertCommand และพารามิเตอร์ที่สอดคล้องกับค่า Title, MIMEType และ ImageData:
<asp:SqlDataSource ID = "UploadPictureDataSource" runat = "เซิร์ฟเวอร์"
การเชื่อมต่อสตริง = "..."
InsertCommand="INSERT INTO [รูปภาพ] ([ชื่อเรื่อง], [MIMEType], [ImageData]) ค่า (@Title, @MIMEType, @ImageData)">
<InsertParameters>
<asp:Parameter Name="Title" Type="String" />
<asp:ชื่อพารามิเตอร์ = "MIMEType" Type = "String" />
<asp:ชื่อพารามิเตอร์="ImageData" />
</แทรกพารามิเตอร์><
</asp:SqlDataSource>
โปรดทราบว่าที่นี่ พารามิเตอร์ ImageData ไม่ได้ระบุประเภท ถ้าคุณพยายามที่จะใช้ตัวช่วยสร้าง GUI เพื่อสร้างไวยากรณ์ของ SqlDataSource นั้นอาจจะระบุ Type="Object" สำหรับมัน อย่างไรก็ตาม Type="Object" นี้จะสร้างพารามิเตอร์ประเภท sql_variant อย่างไรก็ตาม ประเภท sql_variants ไม่สามารถใช้เพื่อจัดเก็บรูปภาพหรือประเภทข้อมูล varbinary (MAX) ได้ เนื่องจากขนาดข้อมูลที่แท้จริงของ sql_variant ต้องไม่เกิน 8,000 ไบต์ (หากคุณพยายามใช้ Type="Object" แล้วพยายามบันทึกข้อมูลไบนารี่ที่มีขนาดเกิน 8,000 ไบต์ ระบบจะส่งข้อยกเว้นพร้อมกับข้อความ "Parameter '@ImageData' เกินขีดจำกัดขนาดสำหรับประเภทข้อมูล sql_variant "; หากคุณพยายามเพิ่มข้อมูลไบนารีที่มีขนาดน้อยกว่า 8,000 ไบต์ ข้อยกเว้นจะแสดงข้อความ "ไม่อนุญาตให้แปลงโดยนัยจากประเภทข้อมูล sql_variant เป็น varbinary(max)"
นอกจากนี้ ตัวควบคุม DetailView ยังมี TemplateFields สองรายการ ในบรรดาตัวควบคุมกล่องข้อความจะใช้ใน TemplateField หนึ่งรายการเพื่อแสดงแถบชื่อเรื่อง ส่วนอีกอันใช้ตัวควบคุม FileUpload เพื่อแสดงแถบ ImageData ผลลัพธ์ที่ได้คืออินเทอร์เฟซผู้ใช้ที่ดูคล้ายกับอินเทอร์เฟซในส่วน "การอัปโหลดรูปภาพและจัดเก็บข้อมูลไบนารีโดยใช้โค้ด ADO.NET" เมื่อคลิกปุ่ม "แทรก" ของ DetailView เหตุการณ์การแทรกจะเริ่มทำงาน ในขณะนี้ ข้อมูลไบนารีจะต้องได้รับจากตัวควบคุม FileUpload อ่านลงในอาร์เรย์ไบต์ และกำหนดให้กับพารามิเตอร์ที่เหมาะสม:
Protected Sub UploadPictureUI_ItemInserting(ByVal sender As Object , ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) จัดการ UploadPictureUI.ItemInserting
'อ้างอิงตัวควบคุม FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'ตรวจสอบให้แน่ใจว่าไฟล์ได้รับการอัปโหลดสำเร็จแล้วหาก UploadedFile.PostedFile ไม่มีสิ่งใดหรือสตริงอื่น IsNullOrEmpty (UploadedFile.PostedFile.FileName) หรือ Else UploadedFile .PostedFile .InputStream ไม่มีอะไรแล้ว
...แสดงข้อความแสดงข้อผิดพลาด...
e.Cancel = จริง
ออกจากย่อย
สิ้นสุด หาก
'ตรวจสอบให้แน่ใจว่าเรากำลังจัดการกับไฟล์ JPG หรือ GIF
ส่วนขยาย Dim As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = ไม่มีเลย
เลือกส่วนขยายกรณีและปัญหา
กรณี ".gif"
ชนิดไมม์ = "รูปภาพ/gif"
ตัวพิมพ์ ".jpg", ".jpeg", ".jpe"
MIMEType = "รูปภาพ/jpeg"
กรณี ".png"
ชนิดไมม์ = "รูปภาพ/png"
กรณีอื่น
'การอัปโหลดประเภทไฟล์ไม่ถูกต้อง... มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น...
e.Cancel = จริง
ออกจากย่อย
สิ้นสุด เลือก
"ระบุค่าของพารามิเตอร์ MIMEType และ ImageData
e.Values("MIMEType") = MIMEType
'โหลด InputStream ของ FileUpload ลงในอาร์เรย์ไบต์
Dim imageBytes (UploadedFile.PostedFile.InputStream.Length) เป็นไบต์
UploadedFile.PostedFile.InputStream.Read (imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
สิ้นสุดย่อย
เช่นเดียวกับตัวจัดการเหตุการณ์การคลิกของปุ่ม "แทรก" ก่อนหน้านี้ ตัวจัดการเหตุการณ์การแทรกของ DetailView ก็ดำเนินการตรรกะเดียวกัน - มีความแตกต่างทางไวยากรณ์เพียงเล็กน้อยเท่านั้น ขั้นแรก เนื่องจากตัวควบคุม FileUpload อยู่ภายในเทมเพลต จึงต้องอ้างอิงทางโปรแกรมโดยใช้เมธอด FindControl("controlID") เมื่ออ้างอิงแล้ว จะมีการตรวจสอบแบบเดียวกันเพื่อให้แน่ใจว่าไฟล์ได้รับการอัปโหลดสำเร็จและอนุญาตให้ใช้นามสกุลที่เหมาะสมได้ ข้อแตกต่างเล็กน้อยกับตัวจัดการเหตุการณ์การแทรกของ DetailView คือ หากมีข้อผิดพลาดเกิดขึ้น เราจำเป็นต้องแจ้ง DetailView ให้หยุดการแทรกที่เกี่ยวข้อง ซึ่งทำได้โดยการตั้งค่าคุณสมบัติ e.Cancel เป็น True
หลังจากตรวจสอบแล้ว พารามิเตอร์ MIMEType และ ImageData จะถูกกำหนดโดยใช้ไวยากรณ์ e.Values("parameterName")=value เช่นเดียวกับในตัวอย่าง ADO.NET ก่อนหน้านี้ ขั้นแรกให้อ่านข้อมูลไบนารีลงในอาร์เรย์ไบต์ จากนั้นจึงกำหนดอาร์เรย์ไบต์ให้กับพารามิเตอร์
6. แสดงเนื้อหาไบนารี
ไม่ว่าคุณจะใช้เทคโนโลยีใดในการจัดเก็บข้อมูลในฐานข้อมูล เพื่อที่จะดึงและแสดงข้อมูลไบนารี เราจำเป็นต้องสร้างเพจ ASP.NET ใหม่ เพจชื่อ ShowPicture.aspx จะส่ง PictureID ไปให้ผ่านทางสตริงการสืบค้น และส่งกลับข้อมูลไบนารีจากฟิลด์ ImageData ของผลิตภัณฑ์ที่ระบุ เมื่อเสร็จแล้ว คุณสามารถดูรูปภาพเฉพาะได้โดยไปที่ที่อยู่ /ShowPicture.aspx?PictureID=picutreID ดังนั้น เพื่อที่จะแสดงรูปภาพบนหน้าเว็บ เราสามารถใช้ตัวควบคุมรูปภาพและตั้งค่าคุณสมบัติ ImageUrl ให้เป็น URL ที่เหมาะสมได้
โปรดทราบว่า ShowPicture.aspx ไม่มีแท็ก HTML ใดๆ ในหน้า .aspx ในตัวจัดการเหตุการณ์ Page_Load ของคลาสโค้ดหลัง รหัส ADO.NET จะถูกนำมาใช้เพื่อดึงข้อมูล MIMEType และ ImageData ของแถวรูปภาพที่ระบุจากฐานข้อมูล จากนั้น ContentType ของเพจจะถูกตั้งค่าเป็นค่าของฟิลด์ MIMEType และข้อมูลไบนารี่จะถูกส่งออกโดยใช้ Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me โหลด
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'เชื่อมต่อกับฐานข้อมูลและส่งกลับเนื้อหารูปภาพและประเภท MIME ของรูปภาพที่ระบุโดยใช้ myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString") ConnectionString)
Const SQL As String = "เลือก [MIMEType], [ImageData] จาก [รูปภาพ] โดยที่ [PictureID] = @PictureID"
หรี่ myCommand เป็น SqlCommand ใหม่ (SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
ถ้า myReader.Read แล้ว
Response.ContentType = myReader("MIMEType").ToString()
Response.BinaryWrite(myReader("ImageData"))
สิ้นสุดถ้า
myReader.Close()
myConnection.ปิด()
สิ้นสุดการใช้
จบหมวดย่อย