در این مقاله سعی بر آن است که توضیح کوتاهی در رابطه با اضافه کردن تصاویر به پایگاه داده SQL Server 2000 داده شود.
در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمیتوانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.
در این قسمت موارد زیر بررسی می شوند:
بررسی پیش نیازهای اضافه نمودن فایل تصویری
کار با شیء Stream
پیدا کردن اندازه و نوع تصویری که آپلود می شود
چگونگی استفاده از متد InputStream
بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:
- تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype=''multipart/form-data''
- داشتن که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
- استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream
سه پارامتر بالا در یک صفحه aspx بکار می روند.ما همچنین به پیش نیازهای زیر در SQL Server نیازمندیم:
- داشتن حداقل یک جدول با فیلدی از نوع image
- بهتر است که فیلد دیگری از نوع varchar جهت ذخیره تایپ تصویر داشته باشیم
روند کار بدین صورت است که در ابتدا محتویات فایل تصویر خوانده میشود و سپس تصویر به جدول افزوده میشود. در زیر کد مربوط به رویداد OnClick مربوط به Submit button که تصویر را خوانده و به جدول SQL اضافه میکند، میپردازیم:
شیء PersonImage نام کنترل HTMLInputFile است. در ابتدا ما نیاز داریم که اندازه تصویری که جهت اضافه کردن انتخاب شده را بدانیم که توسط کد زیر قابل اندازه گیری است:
intImageSize = PersonImage.PostedFile.ContentLength
سپس نوع تصویر را با استفاده از خاصیت ContentType دریافت می کنیم. حال باید یک استریم از تصویر مربوطه دریافت شود:
ImageStream = PersonImage.PostedFile.InputStream
در اینجا ما یک آرایه از بایتها بنام ImageContent که آماده نگهداری محتویات تصویر است، داریم. تصویر ورودی توسط متد Read از شیء Stream خوانده می شود. متد Read سه آرگومان می گیرد:
1. موقعیت مکانی که محتویات تصویر در آن باید کپی شود
2. مکان شروع جهت خواندن
3. تعداد بایتهایی که باید خوانده شود
و دستور مربوط به خواندن هم به شکل زیر است:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم. حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم.
فایل aspx مربوطه:
جدول و زیرروال استفاده شده:
بازیابی تصاویر از SQL Server در ASP.NET:
در مقایسه با اضافه کردن تصویر، بازیابی آن بسیار ساده است. تنها چیز جدید برای این قسمت استفاده از متد BinaryWrite موجود در شیء Response است.
کدهای مورد استفاده جهت بازیابی تصاویر از SQL Server:
در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمیتوانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.
در این قسمت موارد زیر بررسی می شوند:
بررسی پیش نیازهای اضافه نمودن فایل تصویری
کار با شیء Stream
پیدا کردن اندازه و نوع تصویری که آپلود می شود
چگونگی استفاده از متد InputStream
بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:
- تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype=''multipart/form-data''
- داشتن که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
- استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream
سه پارامتر بالا در یک صفحه aspx بکار می روند.ما همچنین به پیش نیازهای زیر در SQL Server نیازمندیم:
- داشتن حداقل یک جدول با فیلدی از نوع image
- بهتر است که فیلد دیگری از نوع varchar جهت ذخیره تایپ تصویر داشته باشیم
روند کار بدین صورت است که در ابتدا محتویات فایل تصویر خوانده میشود و سپس تصویر به جدول افزوده میشود. در زیر کد مربوط به رویداد OnClick مربوط به Submit button که تصویر را خوانده و به جدول SQL اضافه میکند، میپردازیم:
کد:
Public Sub AddPerson(sender As Object, e As EventArgs)
Dim intImageSize As Int64
Dim strImageType As String
Dim ImageStream As Stream
' Gets the Size of the Image
intImageSize = PersonImage.PostedFile.ContentLength
' Gets the Image Type
strImageType = PersonImage.PostedFile.ContentType
' Reads the Image
ImageStream = PersonImage.PostedFile.InputStream
Dim ImageContent(intImageSize) As Byte
Dim intStatus As Integer
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
' Create Instance of Connection and Command Object
Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings(''ConnectionStri ng''))
Dim myCommand As New SqlCommand(''sp_person_isp'', myConnection)
' Mark the Command as a SPROC
myCommand.CommandType = CommandType.StoredProcedure
' Add Parameters to SPROC
Dim prmPersonImage As New SqlParameter(''@PersonImage'', SqlDbType.Image)
prmPersonImage.Value = ImageContent
myCommand.Parameters.Add(prmPersonImage)
Dim prmPersonImageType As New SqlParameter(''@PersonImageType'',
SqlDbType.VarChar, 255)
prmPersonImageType.Value = strImageType
myCommand.Parameters.Add(prmPersonImageType)
Try
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
Response.Write(''New person successfully added!'')
Catch SQLexc As SqlException
Response.Write(''Insert Failed. Error Details are: '' & SQLexc.ToString())
End Try
End Sub
intImageSize = PersonImage.PostedFile.ContentLength
سپس نوع تصویر را با استفاده از خاصیت ContentType دریافت می کنیم. حال باید یک استریم از تصویر مربوطه دریافت شود:
ImageStream = PersonImage.PostedFile.InputStream
در اینجا ما یک آرایه از بایتها بنام ImageContent که آماده نگهداری محتویات تصویر است، داریم. تصویر ورودی توسط متد Read از شیء Stream خوانده می شود. متد Read سه آرگومان می گیرد:
1. موقعیت مکانی که محتویات تصویر در آن باید کپی شود
2. مکان شروع جهت خواندن
3. تعداد بایتهایی که باید خوانده شود
و دستور مربوط به خواندن هم به شکل زیر است:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم. حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم.
فایل aspx مربوطه:
کد:
<%@ Page Language=''vb'' %>
<%@ Import Namespace=''System.Data'' %>
<%@ Import Namespace=''System.Data.SqlClient'' %>
<%@ Import Namespace=''System.IO'' %>
جدول و زیرروال استفاده شده:
کد:
Drop Table Person
Go
Create Table Person
(
PersonID Int Identity,
PersonEmail Varchar(255),
PersonName Varchar(255),
PersonSex Char(1),
PersonDOB DateTime,
PersonImage Image,
PersonImageType Varchar(255)
)
Drop Proc sp_person_isp
Go
Create Proc sp_person_isp
@PersonEmail Varchar(255),
@PersonName Varchar(255),
@PersonSex Char(1),
@PersonDOB DateTime,
@PersonImage Image,
@PersonImageType Varchar(255)
As
Begin
Insert into Person
(PersonEmail, PersonName, PersonSex,
PersonDOB, PersonImage, PersonImageType)
Values
(@PersonEmail, @PersonName, @PersonSex,
@PersonDOB, @PersonImage, @PersonImageType)
End
Go
بازیابی تصاویر از SQL Server در ASP.NET:
در مقایسه با اضافه کردن تصویر، بازیابی آن بسیار ساده است. تنها چیز جدید برای این قسمت استفاده از متد BinaryWrite موجود در شیء Response است.
کدهای مورد استفاده جهت بازیابی تصاویر از SQL Server:
کد:
Public Sub Page_Load(sender As Object, e As EventArgs)
Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings(''ConnectionStri ng''))
Dim myCommand As New SqlCommand(''Select * from Person'', myConnection)
Try
myConnection.Open()
Dim myDataReader as SqlDataReader
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConne ction)
Do While (myDataReader.Read())
Response.ContentType = myDataReader.Item(''PersonImageType'')
Response.BinaryWrite(myDataReader.Item(''PersonIma ge''))
Loop
myConnection.Close()
Response.Write(''Person info successfully retrieved!'')
Catch SQLexc As SqlException
Response.Write(''Read Failed : '' & SQLexc.ToString())
End Try
End Sub