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

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

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

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

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

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 }

執行結果:

參考網址:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060918005956WX6&fumcde=FUM20041006161839LRJ
http://topic.csdn.net/t/20030214/15/1428787.html
http://blog.blueshop.com.tw/hent/archive/2008/03/10/54480.aspx