ASP.NET Tutorial/File Directory/Database Save Load

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Saving uploaded Files to a Database

<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        if (upFile.HasFile)
        {
            srcFiles.Insert();
        }
    }

</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>FileUpload Database</title>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Label
        id="lblFile"
        Text="Word Document:"
        AssociatedControlID="upFile"
        Runat="server" />
    <asp:FileUpload
        id="upFile"
        Runat="server" />
    <asp:Button
        id="btnAdd"
        Text="Add Document"
        OnClick="btnAdd_Click"
        Runat="server" />
    <hr />
    <asp:Repeater
        id="rptFiles"
        DataSourceID="srcFiles"
        Runat="server">
        <HeaderTemplate>
        <ul class="fileList">
        </HeaderTemplate>
        <ItemTemplate>
        <li>
        <asp:HyperLink
            id="lnkFile"
            Text="<%#Eval("FileName")%>"
            NavigateUrl="<%#Eval("Id", "~/FileHandler.ashx?id={0}")%>"
            Runat="server" />        </li>
        </ItemTemplate>
        <FooterTemplate>
        </ul>
        </FooterTemplate>
    </asp:Repeater>
    <asp:SqlDataSource
        id="srcFiles"
        ConnectionString="Server=.\SQLExpress;Integrated Security=True;
            AttachDbFileName=|DataDirectory|FilesDB.mdf;User Instance=True"
        SelectCommand="SELECT Id,FileName FROM Files"
        InsertCommand="INSERT Files (FileName,FileBytes) VALUES (@FileName,@FileBytes)"
        Runat="server">
        <InsertParameters>
            <asp:ControlParameter Name="FileName" ControlID="upFile" PropertyName="FileName" />
            <asp:ControlParameter Name="FileBytes" ControlID="upFile" PropertyName="FileBytes" />
        </InsertParameters>
    </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>
Table Structure
Column Name       Data Type
Id               Int (IDENTITY)
FileName       NVarchar(50)
FileBytes       Varbinary(max)
File: FileHandler.ashx
<%@ WebHandler Language="C#" Class="FileHandler" %>
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
public class FileHandler : IHttpHandler {
    const string conString = @"Server=.\SQLExpress;Integrated Security=True;
        AttachDbFileName=|DataDirectory|FilesDB.mdf;User Instance=True";
    public void ProcessRequest (HttpContext context) {
        SqlConnection con = new SqlConnection(conString);
        SqlCommand cmd =  new SqlCommand("SELECT FileBytes FROM Files WHERE Id=@Id", con);
        cmd.Parameters.AddWithValue("@Id", context.Request["Id"]);
        using (con)
        {
            con.Open();
            byte[] file = (byte[])cmd.ExecuteScalar();
            context.Response.BinaryWrite(file);
        }
    }
    public bool IsReusable {
        get {
            return false;
        }
    }
}