تبدیل داده های باینری از پایگاه داده به فایل PDF و نمایش آن در مرورگر

چهارشنبه 30 اردیبهشت 1394

در این مقاله ابتدا از کاربر میخواهیم یک فایل را آپلود کند سپس فایل آپلود شده را به صورت باینری در پایگاه داده ذخیره میکنیم سپس داده های باینری را ازپایگاه داده خوانده دریک گرید نمایش میدهیم و یک دکمه برای نمایش فایل در گرید قرار میدهیم که با کلیک بر روی آن هم فایل در مرورگر نمایش داده میشودو هم دانلود میشود.

تبدیل  داده های باینری از پایگاه داده به فایل   PDF و نمایش آن در مرورگر

تبدیل  داده های باینری از پایگاه داده به فایل   PDF و نمایش آن در مرورگر

در این مقاله ابتدا از کاربر میخواهیم یک فایل را آپلود کند سپس فایل آپلود شده را به صورت باینری در پایگاه داده ذخیره میکنیم سپس داده های باینری را ازپایگاه داده خوانده دریک گرید نمایش میدهیم و یک دکمه برای نمایش فایل در گرید قرار میدهیم که با کلیک بر روی آن هم فایل در مرورگر نمایش داده میشودو هم دانلود میشود.

حال یک پروژه جدید از نوع وب فرم بسازید و یک صفحه جدید به آن اضافه کنید سپس از جعبه ابزار خود یک کنترل فایل آپلود ویک دکمه و یک گرید به صفحه اضافه کنید:

   <div>
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="btnUpload" runat="server" Text="آپلود" OnClick="Upload" />
        <hr />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="Name" HeaderText="File Name" />
                <asp:TemplateField ItemStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkView" runat="server" Text="نمایش" OnClick="View" CommandArgument='<%# Eval("Id") %>'></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <hr />
        <div>
            <asp:Literal ID="ltEmbed" runat="server" />
        </div>
    </div>

در این مقاله به فضا نام های زیر نیاز خواهیم داشت :


using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

زمانی که روی دکمه آپلود کلیک میکنیم فایل آپلود شده به باینری تبدیل شده و در پایگاه داده ذخیره میشود:


protected void Upload(object sender, EventArgs e)
{
    string filename = Path.GetFileName(FileUpload1.PostedFile.FileName);
    string contentType = FileUpload1.PostedFile.ContentType;
    using (Stream fs = FileUpload1.PostedFile.InputStream)
    {
        using (BinaryReader br = new BinaryReader(fs))
        {
            byte[] bytes = br.ReadBytes((Int32)fs.Length);
            string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                string query = "insert into tblFiles values (@Name, @ContentType, @Data)";
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Connection = con;
                    cmd.Parameters.AddWithValue("@Name", filename);
                    cmd.Parameters.AddWithValue("@ContentType", contentType);
                    cmd.Parameters.AddWithValue("@Data", bytes);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
        }
    }
    Response.Redirect(Request.Url.AbsoluteUri);
}

دررویداد page_load تابع BindGrid را فراخوانی میکنیم درون این تابع رکورد ها را ازپایگاه داده خوانده و در گرید نمایش میدهیم.


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}
private void BindGrid()
{
   string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "select Id, Name from tblFiles";
            cmd.Connection = con;
            con.Open();
            GridView1.DataSource = cmd.ExecuteReader();
            GridView1.DataBind();
            con.Close();
        }
    }
}

زمانی که روی LinkButton درون گرید (نمایش) کلیک میشود توسط تگه های html فایل pdf را در مرورگر نمایش دهیم.

یک رشته از تگه های html و id رکوردی که دکمه نمایش آن کلیک شده را به یک هندلر پاس می دهیم که در هندلر فایل را از پایگاه داده میخوانیم :

    protected void View(object sender, EventArgs e)
    {
        int id = int.Parse((sender as LinkButton).CommandArgument);
        string embed = "<object data=\"{0}{1}\" type=\"application/pdf\" width=\"500px\" height=\"300px\">";
        embed += "اگر شما قادر به دیدن فایل نیستید, شما میتوانید آنرا از <a href = \"{0}{1}&download=1\">اینجا </a>";
        embed += " دانلود کنید یا از <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> فایل را مشاهده کنید.";
        embed += "</object>";
        ltEmbed.Text = string.Format(embed, ResolveUrl("~/FileCS.ashx?Id="), id);
    }

هنگامی که هندلر فراخوانی میشود با استفاده از QueryString و ID ای که در QueryString است فیلد های داده ، نوع  و نام را از پایگاه داده میخوانیم.

زمانی که فرایند فراخوانی داده کامل شد فایل برای دانلود به مرورگر فرستاده میشود که این عمل توسط Response Stream انجام میشود.


<%@ WebHandler Language="C#" Class="FileCS" %>
 
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
public class FileCS : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        int id = int.Parse(context.Request.QueryString["Id"]);
        byte[] bytes;
        string fileName, contentType;
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "SELECT Name, Data, ContentType FROM tblFiles WHERE Id=@Id";
                cmd.Parameters.AddWithValue("@Id", id);
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    sdr.Read();
                    bytes = (byte[])sdr["Data"];
                    contentType = sdr["ContentType"].ToString();
                    fileName = sdr["Name"].ToString();
                }
                con.Close();
            }
        }
 
        context.Response.Buffer = true;
        context.Response.Charset = "";
        if (context.Request.QueryString["download"] == "1")
        {
            context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
        }
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        context.Response.ContentType = "application/pdf";
        context.Response.BinaryWrite(bytes);
        context.Response.Flush();
        context.Response.End();
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

 

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید