2014年1月1日 星期三

[ASP.NET C#] 檔案直接從資料庫呼叫出來變成超連結作法

Reference:http://www.dotblogs.com.tw/puma/archive/2008/03/12/1326.aspx


檔案直接從資料庫呼叫出來變成超連結作法

最近在小舖看到這篇文章...

就把它當作練習程式功力的題目來做....

這支程式主要的功能..如下...

1.利用Fileupload上傳檔案至資料庫

2.將資料庫的記錄以GridView顯示,並多一個Hyperlink帶參數結合ashx檔

3.利用ashx檔提供檔案下載的功能

資料庫規劃如下:
c#範例
FileList.aspx.aspx
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="FileList.aspx.cs" Inherits="FileList" %>
02 
03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
04 
05 <html xmlns="http://www.w3.org/1999/xhtml" >
06 <head runat="server">
07     <title>FileList</title>
08 </head>
09 <body>
10     <form id="form1" runat="server">
11     <div>
12         <asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="Button1"
13             runat="server" OnClick="Button1_Click" Text="upload" />
14         <br />
15         <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White"
16             BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" DataKeyNames="id"
17             DataSourceID="SqlDataSource1" GridLines="Vertical" Width="265px">
18             <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
19             <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
20             <Columns>
21                 <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
22                     SortExpression="id" />
23                 <asp:BoundField DataField="filename" HeaderText="filename" SortExpression="filename" />
24                 <asp:TemplateField HeaderText="download">
25                     <ItemTemplate>
26                         <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# "FileDownload.ashx?id="+Eval("id") %>'>下載</asp:HyperLink>
27                     </ItemTemplate>
28                 </asp:TemplateField>
29             </Columns>
30             <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
31             <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
32             <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
33             <AlternatingRowStyle BackColor="#DCDCDC" />
34         </asp:GridView>
35         <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
36             SelectCommand="SELECT * FROM [fileTable]"></asp:SqlDataSource>
37     </div>    
38     </form>
39 </body>
40 </html>
41
FileList.aspx.cs
01 using System;
02 using System.Data;
03 using System.Configuration;
04 using System.Collections;
05 using System.Web;
06 using System.Web.Security;
07 using System.Web.UI;
08 using System.Web.UI.WebControls;
09 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using System.Data.SqlClient;
12 
13 public partial class FileList : System.Web.UI.Page
14 {
15     protected void Page_Load(object sender, EventArgs e)
16     {
17 
18     }

19     protected void Button1_Click(object sender, EventArgs e)
20     {
21         //判斷檔案是否存在
22         if (this.FileUpload1.HasFile)
23         {
24 
25             //寫入資料庫
26             using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))

27             {
28                 string sql = "insert into [fileTable] ([filename],[filedata]) values(@filename,@filedata)";
29                 SqlCommand cmd = new SqlCommand(sql, conn);
30                 cmd.Parameters.Add("@filename", SqlDbType.NVarChar, 50).Value = this.FileUpload1.FileName;
31                 byte[] filebyte = new byte[this.FileUpload1.PostedFile.InputStream.Length];
32                 this.FileUpload1.PostedFile.InputStream.Read(filebyte, 0, filebyte.Length);
33                 cmd.Parameters.Add("@filedata", SqlDbType.Image).Value = filebyte;
34                 conn.Open();
35                 cmd.ExecuteNonQuery();
36                 this.GridView1.DataBind();
37             }

38         }

39     }

40 }

41
FileDownload.ashx
01 <%@ WebHandler Language="C#" Class="FileDownload" %>
02 
03 <%@ WebHandler Language="C#" Class="FileDownload" %>
04 
05 using System;
06 using System.Web;
07 using System.Data.SqlClient;
08 using System.Data;
09 using System.Configuration;
10 
11 public class FileDownload : IHttpHandler {
12     
13     public void ProcessRequest (HttpContext context) 
14     {
15         int id = int.Parse(context.Request.QueryString["id"]);
16         using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))

17         {
18             string sql = "select * from [fileTable] where id=@id";
19             SqlCommand cmd = new SqlCommand(sql, conn);
20             cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
21             conn.Open();
22             SqlDataReader dr = cmd.ExecuteReader();
23             if (dr.Read())
24             {
25                 context.Response.Buffer = true;
26                 context.Response.Clear();
27                 context.Response.ContentType = "application/download";
28                 context.Response.AddHeader("Content-Disposition""attachment;   filename=" + dr["filename"].ToString() + ";");
29                 context.Response.BinaryWrite((byte[])dr["filedata"]);
30                 context.Response.Flush();
31                 context.Response.End();   
32             }

33             dr.Close();
34         }

35     }

36  
37     public bool IsReusable {
38         get {
39             return false;
40         }

41     }

42 
43 }
執行結果:

沒有留言:

張貼留言