如何在ASP.NET中的代码后面动态创建文件下载链接?

时间:2018-09-05 17:14:38

标签: c# asp.net

我在Web服务器上有文件。我想使它们可供下载到客户端。但是,我不知道文件将是什么,甚至在运行时之前将不知道会有多少个文件。如果我创建了NavigateUrl设置为服务器上文件位置的超链接,则客户端只是尝试在其本地系统上的该位置定位文件,因此不起作用。我可以使用linkbutton来使单个文件工作,但这不是一个选择,因为我无法动态创建它。

有没有办法在ASP.NET中动态地做到这一点?

2 个答案:

答案 0 :(得分:1)

我最终解决此问题的方法是使用中继器,然后将操作放入中继器中,而不是放在链接按钮中。

<asp:Repeater id="repLinks" runat="server" OnItemCommand="repLinks_OnItemCommand">
    <ItemTemplate>
        <li>
            <asp:LinkButton ID="HyperLink1" runat="server" Text='<%# Eval("Name") %>' CommandArgument='<%# Eval("Name") %>'>
            </asp:LinkButton>
        </li>
    </ItemTemplate>
</asp:Repeater>

然后显示以下代码:

protected void repLinks_OnItemCommand(object sender, RepeaterCommandEventArgs e)
{
    Current.Response.AddHeader("Content-disposition", "attachment; filename=" & fileName)
    Current.Response.ContentType = "application/octet-stream"
    Current.Response.WriteFile(System.IO.Path.Combine(_path, e.CommandArgument.ToString))
    Current.Response.Flush()
    Current.Response.[End]()
}

我所缺少的是,对于中继器中的每个LinkBut​​ton,我可以具有相同的处理程序,然后只需将文件名作为CommandArgument传递即可。

答案 1 :(得分:0)

我将从服务器读取文件并将其显示在Repeater Control中

//the relative folder path
string folder = "/images";

//read all the files in the folder
DirectoryInfo di = new DirectoryInfo(Server.MapPath(folder));
FileInfo[] files = di.GetFiles().OrderBy(p => p.Name).ToArray();

//bind to a Repeater
Repeater1.DataSource = files;
Repeater1.DataBind();

然后在aspx页面上

<ul>
    <asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <li>
                <asp:HyperLink ID="HyperLink1" runat="server" 
                     NavigateUrl='<%# "/images/" + Eval("Name") %>'><%# Eval("Name") %>
                </asp:HyperLink>
            </li>
        </ItemTemplate>
    </asp:Repeater>
</ul>