如何从gridview下载文件?

用户1374985

我能够创建一个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'的属性。我该如何解决?

大卫

如错误所示,FileInfo没有名为的属性Value不过,它还有其他属性

根据您的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实施将使用标识符来查找表中的记录,然后使用文件路径形式记录来获取文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章