我们是否可以在一段时间内为单个文件在PHP中创建动态下载链接,或者在此之后下载链接到期。在此期间之后,下载链接会更改。
实际上我有一个要求,即只能通过特定的电子邮件访问下载链接。由于文件的大小,我无法将该文件添加为附件。
任何人都可以帮助我。
答案 0 :(得分:5)
一个解决方案:
创建一个数据库表,该表存储一个大的唯一ID(随机),以及要下载的文件的名称/位置/内容。还包括过期日期。
id | filename | expires
----------------------+--------------------+--------------------
fsdhfs7dfsniuf92un3f2 | secret.doc | 2012-03-23 23:32:32
sdf8shdf829nf32ufn23f | secret2.doc | 2012-03-13 23:32:33
通过电子邮件发送给最终用户的链接......链接应该是:
http://yoursie.com/download/fsdhfs7dfsniuf92un3f2
使用apache重写规则(mod_rewrite),它将捕获漂亮的链接并将其传递给PHP页面:
RewriteEngine on
RewriteRule ^/download/([a-z0-9]{20})$ /download.php?id=$1
在该脚本download.php
中,请查看$_GET['id']
。运行数据库查询以查找记录。检查到期日期。如果一切正常,那就继续。
使用PHP脚本输出正确的标题并下载文件,或者将内部重定向发送到前端代理,如nginx,这会将下载过程卸载到nginx,而不是将PHP与下载。
无论哪种方式,您都可以使用安全,可过期的链接发送给最终用户。
小心!
答案 1 :(得分:2)
当然,将文件的路径存储在数据库中,以及唯一标识符和到期时间戳。然后,当用户在get变量中访问具有唯一ID的链接时,请检查时间戳并获取文件/相应地显示错误。
答案 2 :(得分:0)
数据库表:
ID 文件(在公共可访问的路径之外) 到期
然后有一个脚本get-file.php?id = XXXXXX
<?not-real-code
Delete everything expired from table
Look up record for id=XXXXXXX
If exists then use something like readfile() to read and output file
Delete record in table
答案 3 :(得分:0)
您可以安装一个数据库,您可以在其中放置文件,时间戳和表格。然后,在您的脚本中,您可以检查时间戳+ 86400 *天(86400是一天的秒数)。如果下载是在该时间范围内,则允许下载,否则不允许。然后,您可以使用readfile()输出要下载的文件,并使用header()调用调整编码。要获得更具体的帮助,您必须发布一些代码。
答案 4 :(得分:0)
注意:如果您需要自动执行任何此类查看cron作业。