Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 生成唯一下载链接以仅下载一次_Php_Http - Fatal编程技术网

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

Php 生成唯一下载链接以仅下载一次,php,http,Php,Http,我想为我的用户创建一些独特的下载链接。原因是我想让他们只下载一次,这样他们就可以使用相同的链接再次下载 我已经在数据库和标志字段中生成了一些键(例如,qwertyasdfghzxcbn。因为在下载链接中类似于www.xxxxx.com/download.php?qwertyasdfghzxcbn),当用户下载时,它会将1更新为标志字段 我在网上搜索了一下,找到了这个。 但是,只有当您首先转到页面时,这才有效,然后只有页面才会生成唯一的链接。我已经在我的数据库中预生成了链接,我不需要再次重新生成

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

我已经在数据库和标志字段中生成了一些键(例如,qwertyasdfghzxcbn。因为在下载链接中类似于www.xxxxx.com/download.php?qwertyasdfghzxcbn),当用户下载时,它会将1更新为标志字段

我在网上搜索了一下,找到了这个。


但是,只有当您首先转到页面时,这才有效,然后只有页面才会生成唯一的链接。我已经在我的数据库中预生成了链接,我不需要再次重新生成,如果我在用户进入页面时生成密钥,他们可以通过刷新页面多次下载。

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


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

解决方案是将链接目标本身设置为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实际上是什么)。这将是实际的下载链接,因为该脚本确实传输文件;但前提是允许用户检索它。您必须自己编写
文件位置()
检查权限()
标记下载的()
函数。

我刚醒来,但问题到底出在哪里?为什么要跟踪它们只下载一次?许多系统都使用链接生存期,因此如果不需要,它们不会向数据库发送垃圾邮件。如果文件较大或文件较多,它们通常会尝试避免使用php/数据库。我的网站的工作方式如下:用户刷新页面,使用唯一哈希静态单词+时间生成唯一链接,开始下载活动的\u下载在数据库中标记,用户下载或取消文件,服务器从活动的\u下载中删除文件。链接生命周期为5分钟,没有存储哈希键。你有任何指导如何做?我完全不知道。提前感谢。在这里查看uniqid()函数:根据数据库,使用mysql。当然,可能有学习曲线。
readfile()
,而不是
echo file\u get\u contents()
。更好的是Apache的modxsendfile。除非你真的喜欢通过将文件读入内存来浪费资源。@deceze我写了一个20秒的实现,没有仔细研究所有读取和发送文件的方法。我相信你的功能更好,所以谢谢你的信息!我现在有点明白了。但我仍然是php领域的业余爱好者,你们有一些循序渐进的指南或教程吗?@AdamSmith不是真的,我只是快速编写了那个代码。但是试着做一些事情,试着让它发挥作用,然后再问一次它是否起作用。