当我向用户提供下载时,我不希望他们能够复制该URL并与其他人共享。更进一步:我只想下载一次。如果他们第二次访问该网址,我想投出404。
如何阻止用户第二次访问下载URL,并且此方法是完全证明的。
我目前按以下方式提供文件:
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
// Get the contents of the original file:
echo file_get_contents('example.pdf');
我还在我的mysql数据库中添加了一个表
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
答案 0 :(得分:4)
我想我可能已经找到了在@ Ben-JD的回答帮助下做到这一点的方法。我试图说清楚,以防其他人偶然发现同样的问题。
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
CREATE TABLE IF NOT EXISTS `downloads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`file` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`flags` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
当用户点击下载链接时:
将文件名和令牌插入下载表
$ token = uniqid(); $ filename ='download.pdf';
//使用您喜欢的方法进行查询 // INSERT INTO下载(文件,标记,标记)VALUES('“。$ filename。”','“。$ token。”',0);
现在执行以下操作:
提供文件
标题(“位置:download.php?file =”。$ filename。“& token =”。$ token);
的download.php:
// SELECT filename FROM downloads WHERE filename='".$filename."' AND token='".$token."' AND flags=0;
如果该查询未返回结果,则可以给出错误。否则,请使用您的代码
返回下载header("Content-type: application/pdf");
header("Content-Disposition: attachment;filename='".$filename."'");
echo file_get_contents($filename);
答案 1 :(得分:3)
您需要使用重定向到该文件的下载脚本。在重定向到文件之前,脚本需要通过唯一令牌(存储在数据库中)验证URL。该脚本可以记录下载并在数据库中设置标志。检查标记以防止将来下载。
编辑:这是一个示例(带伪代码):
if( isset($_GET["token"]) && !empty($_GET["token"]) )
{
//verify $_GET["token"] matches a token in the db
//verify that the download flag has not been set
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
//set the downloaded flag in the database so that this file can't be downloaded again
// Get the contents of the original file:
echo file_get_contents('example.pdf');
}
else
header("HTTP/1.0 404 Not Found");
答案 2 :(得分:1)
只需在表格中添加下载计数器字段,然后根据下载次数生成唯一的网址。
每当有人试图下载文件时,您都会将数据库中的计数器增加+1。
他们第二次打开下载网址时,他们没有访问相同的网址。你现在有一个下载计数器。
如果您想阻止共享提供的网址。因此,用户根本不下载文件,您可能需要创建第二个表,其中存储具有文件ID的用户ID。