想在gridview中添加一个可以下载文档的列按钮,每一行的相应的下载地址是知道的。请问怎么完成呢。谢谢。

解决方案 »

  1.   

    请参考create database FilesDB
    go
    use FilesDB
    go
    create table Files
    (
    Id Int IDENTITY primary key,
    FileName NVarchar(50),
    UpFilePath Nvarchar(255),
    UpTime DateTime default getdate()
    )<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploadDemo.aspx.cs" Inherits="FileUploadDemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上传" />
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id"
                DataSourceID="SqlDataSource1" OnRowCommand="GridView1_RowCommand">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:LinkButton ID="LinkButton1" runat="server" CommandName="download" CommandArgument='<%#Eval("upFilePath") %>'>下载</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowDeleteButton="True" />
                    <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
                        SortExpression="Id" />
                    <asp:BoundField DataField="FileName" HeaderText="FileName" SortExpression="FileName" />
                    <asp:BoundField DataField="UpFilePath" HeaderText="UpFilePath" SortExpression="UpFilePath" />
                    <asp:BoundField DataField="UpTime" HeaderText="UpTime" SortExpression="UpTime" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.\SQLExpress;Initial Catalog=FilesDB;Integrated Security=True"
                DeleteCommand="DELETE FROM [Files] WHERE [Id] = @Id" InsertCommand="INSERT INTO [Files] ([FileName], [UpFilePath], [UpTime]) VALUES (@FileName, @UpFilePath, @UpTime)"
                ProviderName="System.Data.SqlClient" SelectCommand="SELECT [Id], [FileName], [UpFilePath], [UpTime] FROM [Files]"
                UpdateCommand="UPDATE [Files] SET [FileName] = @FileName, [UpFilePath] = @UpFilePath, [UpTime] = @UpTime WHERE [Id] = @Id">
                <DeleteParameters>
                    <asp:Parameter Name="Id" Type="Int32" />
                </DeleteParameters>
                <UpdateParameters>
                    <asp:Parameter Name="FileName" Type="String" />
                    <asp:Parameter Name="UpFilePath" Type="String" />
                    <asp:Parameter Name="UpTime" Type="DateTime" />
                    <asp:Parameter Name="Id" Type="Int32" />
                </UpdateParameters>
                <InsertParameters>
                    <asp:Parameter Name="FileName" Type="String" />
                    <asp:Parameter Name="UpFilePath" Type="String" />
                    <asp:Parameter Name="UpTime" Type="DateTime" />
                </InsertParameters>
            </asp:SqlDataSource>
        
        </div>
        </form>
    </body>
    </html>        protected void Button1_Click(object sender, EventArgs e)
            {
                if (FileUpload1.HasFile)
                {
                    FileUpload1.SaveAs(MapPath(FileUpload1.FileName));
                    const string cnString = @"Server=.\SQLExpress;Integrated Security=True;database=FilesDB";
                    SqlConnection cn = new SqlConnection(cnString);
                    SqlCommand cmd = new SqlCommand("insert into Files(FileName,upFilePath,UpTime) values(@fileName, @upFilePath, getdate())", cn);
                    cmd.Parameters.AddWithValue("@fileName", FileUpload1.FileName);
                    cmd.Parameters.AddWithValue("@upFilePath", MapPath(FileUpload1.FileName));
                    cn.Open();
                    cmd.ExecuteNonQuery();
                    cn.Close();                DataBind();
                }
            }        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "download")
                {
                    FileStream fileStream = new FileStream(e.CommandArgument.ToString(), FileMode.Open);
                    long fileSize = fileStream.Length;
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + HttpUtility.UrlEncode(e.CommandArgument.ToString(), System.Text.Encoding.UTF8) + "\"");
                    Response.AddHeader("Content-Length", fileSize.ToString());
                    byte[] fileBuffer = new byte[fileSize];
                    fileStream.Read(fileBuffer, 0, (int)fileSize);
                    fileStream.Close();
                    Response.BinaryWrite(fileBuffer);
                    Response.End(); 
                }
                DataBind();
            }
      

  2.   

    请参考大概的样子是这样
    <%@ Page Language="C#" MasterPageFile="~/DepartmentMainMasterPage.master" AutoEventWireup="true" CodeFile="DepartmentDownload.aspx.cs" Inherits="DepartmentDownload" Title="相关下载" StylesheetTheme="WinXP_Blue" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        
        <asp:HiddenField ID="HF_DepartmentId" runat="server" />
        <asp:HiddenField ID="HF_BlockId" runat="server" />
        
     <asp:GridView ID="dgFileList" SkinID ="GridView" runat="server" OnRowDataBound="dgFileList_RowDataBound">
                <Columns>
                    <asp:HyperLinkField  HeaderText="文件名称" DataNavigateUrlFields="Name" DataNavigateUrlFormatString='' DataTextField="Name" SortExpression="Name" />
                    <asp:BoundField DataField="Length" HeaderText="文件大小(bytes)" SortExpression="Length" >
                        <ItemStyle HorizontalAlign="Right" />
                    </asp:BoundField>
                    <asp:BoundField DataField="LastWriteTime" HeaderText="创建时间" SortExpression="LastWriteTime" />
       <asp:BoundField DataField="Extension" HeaderText="文件类型" SortExpression="Extension" />
                </Columns>
            </asp:GridView>
    </asp:Content>protected void Page_Load(object sender, EventArgs e)
        {
            string DepartmentId = Request.QueryString["DepartmentId"];
            string BlockId = Request.QueryString["BlockId"];
            dlDir = @"D:\WebDownloadFiles\Department\";
            dlDir += DepartmentId + "\\";
            dlDir += BlockId + "\\";        HF_BlockId.Value = BlockId;
            HF_DepartmentId.Value = DepartmentId;
            string strFileName = Request.QueryString["FileName"];
            if (!string.IsNullOrEmpty(Request.QueryString["FileName"]))
            {
                string path = dlDir + strFileName;
                string ext = System.IO.Path.GetExtension(strFileName);            switch (ext)
                {
                    case ".doc":
                        Response.ContentType = "application/doc";
                        string filename;
                        filename = "attachment;filename=" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(path), System.Text.Encoding.UTF8);
                        Response.AppendHeader("Content-Disposition", filename);
                        FileInfo _fileInfo = new FileInfo(path);
                        Response.AppendHeader("Content-Length", _fileInfo.Length.ToString());                    Response.TransmitFile(path);                    break;
                    case ".xls":
                        Response.ContentType = "application/xls";
                        filename = "attachment;filename=" + HttpUtility.UrlEncode(System.IO.Path.GetFileName(path), System.Text.Encoding.UTF8);
                        Response.AppendHeader("Content-Disposition", filename);
                        _fileInfo = new FileInfo(path);
                        Response.AppendHeader("Content-Length", _fileInfo.Length.ToString());
                        Response.TransmitFile(path);
                        break;
                    default:
                        Console.WriteLine("Default case");
                        break;
                }
            }
            else
            {        }        FolderManager fm = new FolderManager(dlDir);
            if (fm.FolderExists)
            {
                this.BindFileDataToGrid("Name");
            }
        }
    public void BindFileDataToGrid(string strSortField)
        {
            string strPath = dlDir;
            DataTable filesTable = new DataTable();
            filesTable.Columns.Add("Name", Type.GetType("System.String"));
            filesTable.Columns.Add("Length", Type.GetType("System.Int32"));
            filesTable.Columns.Add("LastWriteTime", Type.GetType("System.DateTime"));
            filesTable.Columns.Add("Extension", Type.GetType("System.String"));        FolderManager fm = new FolderManager(dlDir);
            //拷贝相关文件
            Array arrFileInfo = fm.FileList;
            //Array arrFileInfo = new DirectoryInfo(this.Server.MapPath(strPath)).GetFiles();
            IEnumerator _ienum = arrFileInfo.GetEnumerator();
            try
            {            while (_ienum.MoveNext())
                {
                    FileInfo myFileInfo = (FileInfo)_ienum.Current;
                    DataRow myDataRow = filesTable.NewRow();
                    myDataRow["Name"] = myFileInfo.Name;
                    myDataRow["Length"] = myFileInfo.Length;
                    myDataRow["LastWriteTime"] = myFileInfo.LastWriteTime;
                    myDataRow["Extension"] = myFileInfo.Extension;
                    filesTable.Rows.Add(myDataRow);
                }
            }
            finally
            {
                if (_ienum is IDisposable)
                {
                    (_ienum as IDisposable).Dispose();
                }
            }
            DataView myDataView = filesTable.DefaultView;
            myDataView.Sort = strSortField;
            this.dgFileList.DataSource = myDataView;
            this.dgFileList.DataBind();
        }    protected void dgFileList_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            HyperLink hl;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                hl = e.Row.Cells[0].Controls[0] as HyperLink;
                hl.NavigateUrl = GetHF() + "FileName=" + hl.Text;
            }
        }