如何从gridview下载文件?

时间:2014-09-12 13:49:19

标签: c# asp.net gridview file-io

我能够创建一个显示文件和修改日期的GridView,但现在我需要允许我的用户下载它们。这是我尝试过的:

我的FormLoad中的代码

DirectoryInfo di = new DirectoryInfo(Server.MapPath(strDirectory));
List<FileInfo> files = di.GetFiles().ToList();
GridView1.DataSource = files;
GridView1.DataBind();

下载文件方法

protected void DownloadFile(object sender, EventArgs e)
{
    string filePath = (sender as LinkButton).CommandArgument;
    Response.ContentType = ContentType;
    Response.AppendHeader("Content-Disposition", "attachment; 
    filename=" + Path.GetFileName(filePath));
    Response.WriteFile(filePath);
    Response.End();
}

GridView中的链接按钮

<asp:TemplateField>
    <ItemTemplate>
    <asp:LinkButton ID="lnkDownload" 
    Text = "Download" <%-----CommandArgument = '<%# Eval("Value") %>'-----%>
    runat="server" OnClick = "DownloadFile"></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

我不得不对命令参数进行注释,因为当我从这里更改了formload中的代码以便修改日期/时间时:

string[] filePaths = Directory.GetFiles(Server.MapPath(strDirectory));
List<ListItem> files = new List<ListItem>();
foreach (string filePath in filePaths)
{
    files.Add(new ListItem(Path.GetFileName(filePath), filePath));
}
GridView1.DataSource = files;
GridView1.DataBind(); 

它开始提供错误 DataBinding:'System.IO.FileInfo'不包含名为'Value'的属性。 如何解决此问题?< / p>

1 个答案:

答案 0 :(得分:1)

如错误所述,FileInfo没有名为Value的属性。 It has other properties, though

根据您的DownloadFile方法实现,您看起来希望该值为文件系统路径。那将是FullName属性。所以它可能看起来像这样:

<asp:LinkButton ID="lnkDownload" 
Text = "Download" CommandArgument = '<%# Eval("FullName") %>'
runat="server" OnClick = "DownloadFile"></asp:LinkButton>

请注意,这不是一个好主意。它向您的用户提供文件系统信息。本身可能看起来不那么糟糕,但如果恶意用户试图收集有关您服务器的信息,那么您只是向他提供另一条信息。最终,您的应用程序的用户不需要了解您的服务器端文件系统,因此您不应该告诉他们。

我建议为您的文件保留某种标识符。如果它们全部在同一目录中,那么您只需使用该文件的名称:

<asp:LinkButton ID="lnkDownload" 
Text = "Download" CommandArgument = '<%# Eval("Name") %>'
runat="server" OnClick = "DownloadFile"></asp:LinkButton>

然后您需要创建服务器端的完整路径:

string fileName = (sender as LinkButton).CommandArgument;
string filePath = Path.Combine(directoryName, fileName);

directoryName将是包含文件的目录的路径,但是您要确定这一点。Web.config值非常适用于此。)

如果他们不在同一个文件夹中,那么我建议使用数据库表来跟踪文件。该表真正需要的只是一个主键(一个IDENTITY列适用于那个)和文件的路径。

然后你将绑定到该数据库表,而不是绑定到文件集合。 CommandArgument将是表记录的标识符,DownloadFile实现将使用标识符查找表记录,然后使用记录的文件路径表单来获取文件。