خواندن و نوشتن داده های باینری در ASP.NET

در این مقاله نحوه خواندن داده های باینری، نحوه تبدیل آنها به فرمت مخصوص خود، طریقه نوشتن این فایل ها به عنوان داده باینری و ذخیره آنها در بانک اطلاعاتی همراه با مثال مورد بررسی قرار می گیرد.

خواندن و نوشتن داده های باینری در ASP.NET

آکادمی برنامه نویسان ، برگزار کننده دوره های آموزش برنامه نویسی با استفاده از اساتید مجرب و حرفه ای در سراسر ایران .

[ جهت مشاهده دوره های درحال ثبت نام کلیک کنید ]

ارائه مدارک معتبر آموزشی و ورود به بازار کار .

فایلها می توانند به سادگی در بانک اطلاعاتی SQL SERVER ذخیره شده و این ذخیره سازی باعث سادگی در مدیریت آنها می شود.

در این جا نحوه ذخیره و بازیافتن فایلها به/از بانک اطلاعاتی شرح داده خواهد شد.

طراحی بانک اطلاعاتی

ابتدا یک بانک اطلاعاتی با نام dbFiles و یک جدول با نام tblFiles می سازیم.

مانند شکل زیر 4 فیلد برای این جدول در نظر می گیریم.

همچنین برای صرفه جویی در زمان می توان بانکی با نام dbFiles ساخته سپس از اسکریپت زیر برای ساخت جدول آن استفاده کنید.

USE [dbFiles]
GO
/****** Object:  Table [dbo].[tblFiles]    Script Date: 05/26/2015 16:44:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblFiles](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NULL,
	[ContentType] [varchar](50) NULL,
	[Data] [varbinary](max) NULL,
 CONSTRAINT [PK_tblFiles] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

شمارنده خودکار را برای فیلد id فعال می کنیم تا به صورت خودکار افزایش یابد.

انواع محتوا

بسته به نوع محتوا، انواع زیر در نظر گرفته شده است:

در فایل ضمیمه، دیتابیس لازم برای این پروژه موجود می باشد و تنها کافی است آن را در SQL SERVER اجرا نمایید.

رشته اتصال

اگر نسخه SQL EXPRESS روی سیستم شما نصب می باشد از رشته زیر :

<connectionStrings>

<add name="conString" connectionString="Data Source=.\SQLEXPRESS;database=dbFiles; Integrated Security=true"/>
</connectionStrings >

 

و در غیر این صورت از رشته زیر استفاده نمایید.

  <connectionStrings>
    <add name="conString" connectionString="Data Source=.;Initial Catalog=dbFiles;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

توجه داشته باشید در صورتیکه از SQL نسخه EXPRESS استفاده می نمایید باید ابتدا طبق شکل زیر فایلهای mdf بانک اطلاعاتی موجود در فولدر پروژه را، در محل قرارگیری SQLEXPRESS در سیستم کپی نمایید.

 

 

خواندن فایل ها به عنوان داده باینری

فایل ها درون یک File Stream خوانده خواهند شد سپس File Stream بوسیله BinaryReader به آرایه بایتی تبدیل شده تا درون جدول بانک اطلاعاتی ذخیره شود.

 

// خواندن فایل و تبدیل آن به آرایه بایت

string filePath = Server.MapPath("APP_DATA/TestDoc.docx");

string filename = Path.GetFileName(filePath);

 

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs);

Byte[] bytes = br.ReadBytes((Int32)fs.Length);

br.Close();

fs.Close();

 

ذخیره داده باینری در بانک اطلاعاتی

زمانیکه فایل به آرایه بایت تبدیل می شود در بانک اطلاعاتی درج خواهد شد.نام فایل، نوع محتوای فایل و داده باینری با فایل های ذخیره شده در بانک اطلاعاتی شباهت دارند.

شکل زیر نحوه ذخیره شدن داده در جدول را نمایش می دهد.

//درج فایل درون بانک اطلاعاتی
string strQuery = "insert into tblFiles(Name, ContentType, Data) values (@Name, @ContentType, @Data)";

SqlCommand cmd = new SqlCommand(strQuery);

cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename;

cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value = "application/vnd.ms-word";

cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes;

InsertUpdateData(cmd);

 

تابع InsertUpdateData شیء SqlCommand می گیرد و query را اجرا کرده و داده را در بانک اطلاعاتی درج می نماید.

 

private Boolean InsertUpdateData(SqlCommand cmd)

{

    String strConnString = System.Configuration.ConfigurationManager

    .ConnectionStrings["conString"].ConnectionString;

    SqlConnection con = new SqlConnection(strConnString);

    cmd.CommandType = CommandType.Text;

    cmd.Connection = con;

    try

    {

        con.Open();

        cmd.ExecuteNonQuery();

        return true;

    }

    catch (Exception ex)

    {

        Response.Write(ex.Message);

        return false;

    }

    finally

    {

        con.Close();

        con.Dispose();

    }

}

 

خواندن داده باینری از بانک اطلاعاتی

برای پس گرفتن فایل از بانک اطلاعاتی دستور SELECT اجراشده و ID, فایل به عنوان پارامتر پاس داده می شود.

command object آماده شده و به GetData پاس داده می شود. GetData جدول داده که شامل فایل داده مطلوب می باشد برمی گرداند.

string strQuery = "select Name, ContentType, Data from tblFiles where id=@id";

SqlCommand cmd = new SqlCommand(strQuery);

cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;

DataTable dt = GetData(cmd);

if (dt != null)

{

    download(dt);

}

در زیر کد مربوط به تابع GetData را مشاهده می کنید. یک تابع ساده که دستور SELECT را اجرا می کند. برای اطلاعات بیشتر در مورد دستور SELECT روی این لینک کلیک نمایید.

private DataTable GetData(SqlCommand cmd)

{

    DataTable dt = new DataTable();

    String strConnString = System.Configuration.ConfigurationManager

    .ConnectionStrings["conString"].ConnectionString;

    SqlConnection con = new SqlConnection(strConnString);

    SqlDataAdapter sda = new SqlDataAdapter();

    cmd.CommandType = CommandType.Text;

    cmd.Connection = con;

    try

    {

        con.Open();

        sda.SelectCommand = cmd;

        sda.Fill(dt);

        return dt;

    }

    catch

    {

        return null;

    }

    finally

    {

        con.Close();

        sda.Dispose();

        con.Dispose();

    }

}

 

تبدیل و دانلود داده باینری به عنوان یک فایل

در زیر تابعی که برای دانلود فایل می باشد را مشاهده می نمایید. این تابع محتوای فایل را خوانده و همچنین نام فایل(FileName) و (ContentType) را می گیرد. سپس بایتها را بوسیله Response.BinaryWrite در Response می نویسد.

 private void download (DataTable dt)

{

    Byte[] bytes = (Byte[])dt.Rows[0]["Data"];

    Response.Buffer = true;

    Response.Charset = "";

    Response.Cache.SetCacheability(HttpCacheability.NoCache);

    Response.ContentType = dt.Rows[0]["ContentType"].ToString();

    Response.AddHeader("content-disposition", "attachment;filename="

    + dt.Rows[0]["Name"].ToString());

    Response.BinaryWrite(bytes);

    Response.Flush();

    Response.End();

}
فایل های ضمیمه