Asp.net 列出可供下载的文件-文件存储在应用程序只能访问的位置

Asp.net 列出可供下载的文件-文件存储在应用程序只能访问的位置,asp.net,.net-2.0,Asp.net,.net 2.0,我有一组pdf文件存储在只有应用程序才能访问的位置,因此无法通过http直接访问这些文件 文件路径由数据库存储,当用户选择下载文件时,将执行以下代码: Response.ContentType = "Application/pdf" Response.AppendHeader("Content-Disposition", "attachment; filename=<some file name>") Response.TransmitFile(Server.MapPath("

我有一组pdf文件存储在只有应用程序才能访问的位置,因此无法通过http直接访问这些文件

文件路径由数据库存储,当用户选择下载文件时,将执行以下代码:

 Response.ContentType = "Application/pdf"
 Response.AppendHeader("Content-Disposition", "attachment; filename=<some file name>")
 Response.TransmitFile(Server.MapPath("<the file path>"))
 Response.End()
它不能仅仅是一个url链接,因为正如我提到的,文件不能直接访问,每次下载都需要执行一些代码

使用.net2.0实现这一目标的优雅解决方案是什么

对于常规ASP.NET(2.0),您可能希望创建一个“处理程序”。最简单的选择是添加一个“通用处理程序”(ashx)模板,然后在页面上添加一个常规链接(例如)“download.ashx?id=2”

在处理程序内部,解析查询字符串,并将文件流式传输给用户:

    public void ProcessRequest(HttpContext context)
    {
        // set headers...
        string filePath = FindPath(context.Request.QueryString("id"));
        context.Response.WriteFile(filePath);
    }
其中
FindPath
解析查询字符串链接中的物理文件


如果这是ASP.NET MVC,您可以使用
文件(路径)
操作结果。

您返回给用户的文件列表中的URL可以指向一个ASPX页面,该页面可以下载这些文件,就像您提供的示例代码一样。

+1-非常好的答案。很少有人知道如何使用ASHX文件,尽管它们很有用。谢谢你,马克,这给我指明了正确的方向。我认为FindPath函数结果需要是特定于用户/会话的,以确保有人不会直接使用他没有权限的ID调用页面。就个人而言,我有固定的ID,只需检查方法内部的权限(可能使用数据库ID)。这样,只要您有访问权限,会话/浏览器之间的链接就可以工作。这或多或少就是我所说的会话/用户特定的意思。我被认为是将文件路径列表存储为会话,id将是列表中的id,或者使用传递的id从db中检索它,但我还需要检查用户是否具有文件的权限,以检查我是否也需要传递userId,在会话中,我相信您可以直接调用Download.ashx?id=2?user=5。我理解,为了使用会话数据,处理程序需要实现System.Web.SessionState.IRequiresessionState。
    public void ProcessRequest(HttpContext context)
    {
        // set headers...
        string filePath = FindPath(context.Request.QueryString("id"));
        context.Response.WriteFile(filePath);
    }