Create temporary link for download

后端 未结 5 1525
一向
一向 2020-12-08 18:04

I use ASP.NET
I need to give user temporary link for downloading file from server.
It should be a temporary link (page), which is available for a short time (12 hour

5条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-08 18:34

    Here's a reasonably complete example.

    First a function to create a short hex string using a secret salt plus an expiry time:

    public static string MakeExpiryHash(DateTime expiry)
    {
        const string salt = "some random bytes";
        byte[] bytes = Encoding.UTF8.GetBytes(salt + expiry.ToString("s"));
        using (var sha = System.Security.Cryptography.SHA1.Create())
            return string.Concat(sha.ComputeHash(bytes).Select(b => b.ToString("x2"))).Substring(8);
    }
    

    Then a snippet that generates a link with a one week expiry:

    DateTime expires = DateTime.Now + TimeSpan.FromDays(7);
    string hash = MakeExpiryHash(expires);
    string link = string.Format("http://myhost/Download?exp={0}&k={1}", expires.ToString("s"), hash);
    

    Finally the download page for sending a file if a valid link was given:

    DateTime expires = DateTime.Parse(Request.Params["exp"]);
    string hash = MakeExpiryHash(expires);
    if (Request.Params["k"] == hash)
    {
        if (expires < DateTime.UtcNow)
        {
            // Link has expired
        }
        else
        {
            string filename = "";
            FileInfo fi = new FileInfo(Server.MapPath(filename));
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
            Response.AddHeader("Content-Length", fi.Length.ToString());
            Response.WriteFile(fi.FullName);
            Response.Flush();
        }
    }
    else
    {
        // Invalid link
    }
    

    Which you should certainly wrap in some exception handling to catch mangled requests.

提交回复
热议问题