与ASP.NET的临时文件下载链接

与ASP.NET的临时文件下载链接,.net,asp.net,url-rewriting,.net,Asp.net,Url Rewriting,我想知道如何在有限的时间内为我的文件生成临时下载地址。我知道这不是最佳实践,根据 但我很想知道如何使用urlrewriting,使用GUID或其他神秘的命名技术生成文件名,并使其在有限的时间内可用。 如果有人能给我一篇关于它的好文章,我将不胜感激。无论您使用的是哪种ASP.NET框架,我都倾向于使用一个加密的令牌来加密文件id(我估计您有)和一个可以在服务器端解密并根据其时间戳进行验证的日期时间 下面是一个过于简单的实现: public static string GetDownload

我想知道如何在有限的时间内为我的文件生成临时下载地址。我知道这不是最佳实践,根据
但我很想知道如何使用urlrewriting,使用GUID或其他神秘的命名技术生成文件名,并使其在有限的时间内可用。

如果有人能给我一篇关于它的好文章,我将不胜感激。

无论您使用的是哪种ASP.NET框架,我都倾向于使用一个加密的令牌来加密文件id(我估计您有)和一个可以在服务器端解密并根据其时间戳进行验证的日期时间

下面是一个过于简单的实现:

    public static string GetDownloadToken(int fileId)
    {
        byte[] idbytes = BitConverter.GetBytes(fileId); // 4 bytes 
        byte[] dateTimeBytes = BitConverter.GetBytes(DateTime.Now.ToBinary()); // 8 bytes
        byte[] buffer = new byte[16]; // minimum for an encryption block 
        string password = "password";

        byte[] passwordBytes = Encoding.ASCII.GetBytes(password);
        Array.Copy(idbytes, 0, buffer, 0, idbytes.Length);
        Array.Copy(dateTimeBytes, 0, buffer, idbytes.Length, dateTimeBytes.Length);
        byte[] encryptedBuffer = new byte[256]; 
        using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
        {
            int count = sha1.TransformBlock(buffer, 0, buffer.Length, encryptedBuffer, 0);
            return Convert.ToBase64String(encryptedBuffer, 0, count);
        }
    }

首先你需要某种形式的标识符。您建议使用GUID,这很容易做到,
GUID.NewGuid().ToString(“n”)
为您提供了这样一个标识符

你说的URI重写,但那真的只是一点修饰。您当然可以进行一些重写,将
/myFiles/a948ec43e5b743548fd9a77c462b953e
转换为
/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953e
,甚至(在检查查找表后)转换为
myFiles/download.aspx?id=3
myFiles/download.aspx?fileName=myNewDownload.pdf
。这与任何其他URI重写任务相同,因此现在让我们忽略它,并假设有一个请求进入
/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953e
,无论这是否是由于重写

好的。您已经有了一个标识符,您需要将其与三个内容相匹配:流、内容类型和到期日期

您可以将所有这些存储在文件系统中,所有这些都存储在数据库中,或者数据库中的详细信息,包括流作为文件存储在文件系统中的路径

假设将其存储在文件系统中,名称如下:

a948ec43e5b743548fd9a77c462b953e.application_pdf和a5d360178ec14e97abd556ed4b7709cf.text_plain;字符集=utf-8

请注意,我们不使用普通的windows文件扩展名,因此我们可以很好地处理上载计算机与服务器有不同绑定的情况

如果a948ec43e5b743548fd9a77c462b953e是所需的项目,我们首先查看创建日期,如果创建日期太早(文件已过期),我们将发送410 GONE标头,并显示一条错误消息,说明文件已过期(我们也可以在此时删除该文件以清理使用情况,或者截断它,使其保留该文件以前存在的记录,但存储空间为0字节)

否则,我们将
Response.ContentType
设置为“application/pdf”,然后
Response.TransmitFile
发送文件

如果我们以不同于文件的方式存储流,我们会希望以小块的形式发送它(4096很好地匹配系统其他部分的其他缓冲区),如果它非常大,则定期调用
Response.Flush()
,以防止内存问题

这是您的基本系统。细节包括存储原始文件名并将其发送到内容处置头中,以及遵守范围请求,以便用户可以恢复失败的下载,而不必从头开始


所有这些都与用于确保只有正确的人才拥有文件的任何身份验证非常正交-您可以将其与任何类型的登录系统一起使用,也可以将其公开但有时间限制。

您是否使用ASP.NET MVC?在这种情况下,使用url重写有什么好处?为什么guid不能仅在查询中string?@Yuriy:我知道可以这样做。但我也想了解更多关于通过url重写动态生成地址的信息。谢谢。这是您提供的一段非常有趣的代码。但我仍然对我提到的关于动态url重写的显式解决方案非常好奇。请您介绍一下t还有他的事吗?@Kamyar。我正要说你不需要处理程序,你只需要一个ASPX页面,它将内容类型设置为application/octet stream,并将字节写入响应。但是看到你对Jon的回答很满意。我也是伊朗人,很高兴在这里看到伊朗同胞!