GridVIew中下载文件的方法探讨,方法(7)最佳。
在GridView中下载文件,琢磨了很久,终于搞定了。现简单总结一下。不想多看的浏览者,可直接采用方法(7),节省时间。
(1)使用Button下载
在GridView属性中添加:
OnRowCommand="GridView1_RowCommand"
在GridView的<Column>中添加:
<asp:ButtonField runat="server" Text="下载" HeaderText="下载" ButtonType="Button" CommandName="DownLoad_Click"
HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center"/>
在aspx.cs中添加:
protected void GridView1_RowCommand(Object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "DownLoad_Click")//
{
//下载文件代码,可参见上一篇博客文章。
}
}
注:该方法能够实现下载功能,但用户体验一般。另外,如果在下载代码的同时,将下载记录保存到数据库中的话,会插入两条相同的记录,为避免该问题,可以使用if判断,只进行一次数据库操作。
(2)使用Link下载
在GridView的<Column>中添加:
<asp:ButtonField ButtonType="Link" CommandName="DownLoad" DataTextField="文件名" HeaderText="文件名" "/>
另外需类同方法(1),添加OnRowCommand事件。
注:执行错误。通过string fnametype = Server.HtmlDecode(row.Cells[3].Text.ToString());获得的文件名为空。
(3)使用HyperLink下载
在GridView的<Column>中添加:
<asp:HyperLinkField DataNavigateUrlFields="文件名" Target="_blank" HeaderText="文件" Text="下载" />
注:因为DataNavigateUrlFields绑定的是字段,不是文件目录,所以文件需要放在同代码一致的目录下,否则找不到文件。在文件与代码混放的前提下,对于.jpg,.txt等类型的文件,点击后,会打开一个新的页面,然后显示文件内容,如图片或文本,而不是浏览器下载提示,但可以右键保存;对于.zip,.doc等类型文件,可以实现在新页面的下载功能。
(4)使用a标签的href下载之一
在GridView的<Column>中添加:
<asp:TemplateField HeaderText="文件名">
<ItemTemplate>
<a href='javascript:void(0)' onclick="Hc();return false;"
onmouseover="JavaScript:this.style.color='#FF0000'" onmouseout="JavaScript:this.style.color='#000000'"><%#Eval("文件名")%></a>
</ItemTemplate>
</asp:TemplateField>
在<head>中添加:
<script type="text/javascript">
function Hc() {
alert("000");
//下载代码,【尚未实现从GridView中取文件名和文件ID等信息】
}
</script>
注:此功能不知如何实现。因为我不知道如何实现取文件名,所以咱不能实现下载。
(5)使用a标签的href下载之二
在GridView的<Column>中添加:
<ItemTemplate>
<a href='Resource\'+'<%#DataBinder.Eval(Container.DataItem,"文件名") %>' target="_blank"><%#Eval("文件名")%></a>
</ItemTemplate>
注:所有文件都是放在Resource文件夹下,点击后,会出现新页面显示“目录清单”,点击相应的文件后,对不同类型的文件,效果不一样,类同方法(3),也可以右键“目标另存为”。这种方法基本可以否定,安全性为0,不该显示文件的也显示了,用户操作十分不便。
(6)使用a标签的href下载之三
在GridView的<Column>中添加:
<ItemTemplate>
<a href='Resource\<%#DataBinder.Eval(Container.DataItem,"文件名") %>' target="_blank"><%#Eval("文件名")%></a>
</ItemTemplate>
注:与方法(5)的区别是,删除了Resource\后面的 '+' 三个字符。点击后,会出现新页面,对不同类型文件的执行效果不同,类同方法(3)。与方法(3)的区别是,方法(3)的文件与代码混放,而方法(6)文件与代码是分离的。
(7)使用a标签的href下载之四
在GridView的<Column>中添加:
<ItemTemplate>
<a href='Downloading.aspx?fid=<%#DataBinder.Eval(Container.DataItem,"文件ID")%>&fname=<%#DataBinder.Eval(Container.DataItem,"文件名")%>'
target="_blank"><%#Eval("文件名") %></a>
</ItemTemplate>
在Downloading.aspx文件中添加:
protected void Page_Load(object sender, EventArgs e)
{
string strfid = Request.QueryString[0].ToString();
string strfname = Request.QueryString[1].ToString();
//下载文件代码
//保存下载信息到数据库的SQL代码
}
注:需要添加新的页面文件Downloading.aspx。href将对应的、下载必要的、SQL操作必要的信息传递到Downloading.aspx页面。点击后,出现Downloading.aspx,并弹出浏览器下载提示对话框,可以正常下载,也可关闭,关闭后,Downloading.aspx自动关闭。下载方式符合B/S习惯,与请用的网站下载方式一致。
总之,如果在GridView中下载文件的话,采用方法(7)就对了。