生成唯一下载链接以仅下载一次

时间:2013-09-18 08:29:58

标签: php http

我想为我的用户创建一些独特的下载链接。原因是我想让他们只下载一次,这样他们就可以使用相同的链接再次下载。

我在数据库和标志字段中生成了一些密钥(例如,qwertyasdfghzxcbn。在下载链接中将像www.xxxxx.com/download.php?qwertyasdfghzxcbn一样),当用户下载时,它将更新1到标志字段。

我在网上搜索并找到了这个。 http://www.webvamp.co.uk/blog/coding/creating-one-time-download-links/

但只有当您首先访问该页面时才会生效,然后只有该页面才会生成唯一链接。我已经预先生成了我的数据库中的链接,我不需要再次重新生成,如果我在用户访问页面时生成密钥,他们将能够通过刷新页面多次下载。

3 个答案:

答案 0 :(得分:9)

解决方案是使链接目标本身成为PHP脚本。

您将实际文件隐藏在浏览器无法访问的位置(即,您可以通过fopen()访问文件的某个位置,但不在文档根目录中),并将download.php文件放入下载文件。

下载脚本本身看起来像这样:

$fileid = $_REQUEST['file'];
$file = file_location($fileid); // you'd write this function somehow
if ($file === null) die("The file doesn't exist");
$allowed = check_permissions_for($file, $fileid) // again, write this
// the previous line would allow you to implement arbitrary checks on the file
if ($allowed) {
  mark_downloaded($fileid, $file); // so you mark it as downloaded if it's single-use
  header("Content-Type: application/octet-stream"); // downloadable file
  echo file_get_contents($file);
  return 0; // running a return 0; from outside any function ends the script
} else
  die("You're not allowed to download this file");

你指出的任何链接都只是指向download.php?fileid = 712984(无论fileid究竟是什么)。这将是实际的下载链接,因为该脚本确实传输了文件;但仅限于允许用户检索它。您必须自己编写file_location()check_permissions_for()mark_downloaded()函数。

答案 1 :(得分:1)

我知道这个问题有点老了,所以现在就道歉了,但是如果你很乐意使用我构建的http://linkvau.lt API,那么这是一个生成单一的简单方法 - 使用下载链接。由于它是一个JSON API,因此可以使用任何语言,但我还提供了一个简单的PHP库来与API进行交互。

答案 2 :(得分:0)

我建议使用uniqid()函数,并在数据库中存储具有过期日期的唯一ID,同时使用以下内容返回用户URL:...?file_id = $ id

当链接被打开时,您可以将其从数据库中删除或将其标记为“很快”删除(以防用户想要刷新页面。)