5. قم بتحميل الصور وتخزين البيانات الثنائية باستخدام كود التحكم بمصدر بيانات ASP.NET 2.0
على الرغم من أن طريقة ADO.NET تعمل في سياق تطبيق ASP.NET 2.0، إلا أنه يمكنك أيضًا استخدام عناصر تحكم مصدر بيانات ASP.NET 2.0 لتخزين العناصر الثنائية. يتم تخزين البيانات الثنائية في قاعدة بيانات، الأمر الذي لا يتطلب منك كتابة كود ADO.NET. يحتوي عنصر التحكم SqlDataSource المستخدم في هذا البرنامج التجريبي على InsertCommand ومعلمات تتوافق مع قيم Title وMIMEType وImageData:
InsertCommand = "INSERT INTO [Pictures] ([Title]، [MIMEType]، [ImageData]) VALUES (@Title، @MIMEType، @ImageData)">
<asp: اسم المعلمة = "العنوان" النوع = "سلسلة" />
<asp: اسم المعلمة = "MIMEType" النوع = "سلسلة" />
<asp: اسم المعلمة = "ImageData" />
</إدراج معلمات>
</asp:SqlDataSource>
لاحظ أن المعلمة ImageData هنا لا تحدد النوع. إذا حاولت استخدام معالج واجهة المستخدم الرسومية لإنشاء بناء جملة SqlDataSource، فمن المحتمل أن يحدد النوع = "Object" له، ومع ذلك، فإن هذا النوع = "Object" سينتج معلمة من النوع sql_variant. ومع ذلك، لا يمكن استخدام نوع sql_variants لتخزين الصور أو أنواع البيانات المتغيرة (MAX) لأن حجم البيانات المضمنة لـ sql_variant لا يمكن أن يتجاوز 8000 بايت. (إذا حاولت استخدام Type = "Object" ثم حاولت حفظ البيانات الثنائية التي يتجاوز حجمها 8000 بايت، فسيطرح النظام استثناءً بالرسالة "تتجاوز المعلمة '@ImageData' الحد الأقصى لحجم نوع البيانات sql_variant"؛ إذا حاولت إضافة بيانات ثنائية يقل حجمها عن 8000 بايت، فسيعرض الاستثناء الرسالة "التحويل الضمني من نوع البيانات sql_variant إلى varbinary(max) غير مسموح به").
بالإضافة إلى ذلك، يحتوي عنصر التحكم ديتيلفيو على حقلي قالب. من بينها، يتم استخدام عنصر تحكم TextBox في TemplateField واحد لعرض شريط العنوان؛ ويستخدم الآخر عنصر تحكم FileUpload لتمثيل شريط ImageData. والنتيجة النهائية هي واجهة مستخدم تشبه تلك الموجودة في قسم "تحميل الصور وتخزين البيانات الثنائية باستخدام كود ADO.NET". عند النقر فوق الزر "إدراج" في عرض التفاصيل، يتم إطلاق حدث الإدراج الخاص به في هذا الوقت، ويجب الحصول على البيانات الثنائية من عنصر التحكم FileUpload، وقراءتها في صفيف بايت، وتعيين المعلمات المناسبة:
Protected Sub UploadPictureUI_ItemInserting(ByVal). المرسل ككائن، ByVal e كـ System.Web.UI.WebControls.DetailsViewInsertEventArgs) يعالج UploadPictureUI.ItemInserting
'راجع عنصر التحكم FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'تأكد من أنه تم تحميل الملف بنجاح إذا كان UploadedFile.PostedFile لا شيء OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream لا شيء إذن
...عرض رسالة الخطأ...
إلغاء = صحيح
الخروج من الباطن
End If
'تأكد من أننا نتعامل مع ملف JPG أو GIF
تمديد خافت كسلسلة = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType كسلسلة = لا شيء
حدد امتداد الحالة
الحالة ".gif"
نوع MIMEType = "صورة/gif"
حالة ".jpg"، ".jpeg"، ".jpe"
نوع MIMEType = "صورة/jpeg"
الحالة ".png"
نوع MIMEType = "صورة/png"
حالة أخرى
"تحميل نوع ملف غير صالح... تظهر رسالة خطأ...
إلغاء = صحيح
الخروج من الباطن
النهاية حدد
"حدد قيم معلمات MIMEType وImageData
e.Values("MIMEType") = MIMEType
'قم بتحميل InputStream الخاص بـ FileUpload في مصفوفة البايت
تعتيم imageBytes (UploadedFile.PostedFile.InputStream.Length) كبايت
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
تمامًا مثل معالج حدث النقر الخاص بالزر "إدراج" السابق، يقوم معالج حدث الإدراج الخاص بـ DateView أيضًا بتنفيذ نفس المنطق - لا يوجد سوى بعض الاختلافات الطفيفة في بناء الجملة. أولاً، نظرًا لأن عنصر التحكم FileUpload موجود داخل قالب، فيجب الرجوع إليه برمجيًا باستخدام أسلوب FindControl("controlID"). بمجرد الرجوع إليه، يتم إجراء نفس عمليات التحقق للتأكد من أنه تم تحميل الملف بنجاح والسماح بالامتداد المناسب. هناك اختلاف طفيف في معالج أحداث الإدراج في عرض التفاصيل وهو أنه في حالة حدوث خطأ، فإننا نحتاج إلى إخطار عرض التفاصيل لإيقاف عمل الإدراج المقابل - ويتم تحقيق ذلك عن طريق تعيين خاصية e.Cancel على True.
بعد التحقق، سيتم تعيين معلمات MIMEType وImageData باستخدام صيغة القيمة e.Values("parameterName")=. تمامًا كما في مثال ADO.NET السابق، قم أولاً بقراءة البيانات الثنائية في مصفوفة بايت، ثم قم بتعيين مصفوفة البايت إلى المعلمة.
6. عرض المحتوى الثنائي
بغض النظر عن التقنية التي تستخدمها لتخزين البيانات في قاعدة البيانات، فمن أجل استرداد البيانات الثنائية وعرضها، نحتاج إلى إنشاء صفحة ASP.NET جديدة. ستقوم الصفحة المسماة ShowPicture.aspx بتمرير معرف الصورة إليها من خلال سلسلة الاستعلام وإرجاع البيانات الثنائية من حقل ImageData الخاص بالمنتج المحدد. بمجرد الانتهاء، يمكن رؤية صورة معينة من خلال زيارة العنوان /ShowPicture.aspx?PictureID=picutreID. لذلك، لعرض صورة على صفحة ويب، يمكننا استخدام عنصر تحكم الصورة وتعيين خاصية ImageUrl الخاصة به على عنوان URL المناسب.
لاحظ أن ShowPicture.aspx لا يتضمن أية علامات HTML في صفحة .aspx الخاصة به. في معالج الأحداث Page_Load للفئة code-behind، سيتم استخدام كود 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 = "SELECT [MIMEType]، [ImageData] من [الصور] حيث [PictureID] = @PictureID"
تعتيم myCommand كـ SqlCommand جديد (SQL، myConnection)
myCommand.Parameters.AddWithValue("@PictureID"، PictureID)
myConnection.Open()
تعتيم myReader كـ SqlDataReader = myCommand.ExecuteReader
إذا كان myReader.Read بعد ذلك
Response.ContentType = myReader("MIMEType").ToString()
Response.BinaryWrite(myReader("ImageData"))
النهاية إذا
myReader.Close()
myConnection.Close()
إنهاء الاستخدام
نهاية الفرعية