【发布时间】:2009-09-28 08:25:05
【问题描述】:
我见过几个有动态下载链接的网站。
他们要求提供有效的电子邮件地址并将动态创建的下载链接发送到该地址。 前任。 www.mysite.domain/hashvalue1
但是他们是如何做到的,因为文件存在于域中的特定位置? www.mysite.domain/downloads
有这方面的指南吗?
【问题讨论】:
我见过几个有动态下载链接的网站。
他们要求提供有效的电子邮件地址并将动态创建的下载链接发送到该地址。 前任。 www.mysite.domain/hashvalue1
但是他们是如何做到的,因为文件存在于域中的特定位置? www.mysite.domain/downloads
有这方面的指南吗?
【问题讨论】:
他们使用“UrlRewrite”和一个 ASP.NET HttpHandler。
UrlRewrite:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
处理程序:Downlaod.ashx
using System;
using System.Web;
public class GetDownload : IHttpHandler
{
private static string file = "your file location";
public void ProcessRequest (HttpContext context)
{
if(UsersHasRights(context))
{
context.Response.TransmitFile(file);
}
}
public bool IsReusable
{
get { return false; }
}
}
【讨论】:
是的,Web URL 不必与实际文件位置相对应。 在 .NET 中实现这一点的最简单方法是创建一个 IHttpHandler,它使用基于哈希值的 Response.TransmitFile。
在这种情况下,URL 将是 www.mysite.domain/file.ashx?hash=hashvalue1。
如果您使用路由 (ASP.NET 3.5 SP1) 或某种 URL 重写器,您可以获得更好的 URL。
【讨论】:
这可能不是最有效或最好的方法,但可以解决您的问题。您在服务器上的特定位置有文件,当用户单击或请求下载时您知道它。您可以从文件名或路径和电子邮件中获得电子邮件地址并一起创建哈希,您可以向其中添加一些盐以真正随机化它,即使同一用户一次又一次地请求相同的文件。现在把这个散列、文件名和盐(如果你有的话)放到一个数据库表中。您还可以设置链接的过期日期时间。
您可以发送类似 site.com/files.dld?hash 的用户链接并实现 IHttpHandler 来处理此扩展(请参阅 Andrey Shchekin 的 answer)。这里还有一个 article 描述使用 HttpHandler 来提供 zip 文件的下载。
【讨论】: