我能够创建一个显示文件和修改日期的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>
答案 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
实现将使用标识符查找表记录,然后使用记录的文件路径表单来获取文件。