我的网站上有.mp3文件,我想设置我的网站,以便在我的用户登录后可以下载文件。如果用户未登录,则无法下载文件。我不希望任何人能够找到文件的路径。
答案 0 :(得分:9)
我只能通过HTTP请求来访问该文件,而使用PHP,只需将其打印出来:
<?php
session_start();
if (isset($_SESSION['logged_in'])) {
$file = '/this/is/the/path/file.mp3';
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($file));
readfile($file);
}
?>
答案 1 :(得分:3)
您可以根据用户会话ID和某个随机值等内容创建令牌。然后,登录的用户URL将如下:
/download.php?token=4782ab847313bcd
答案 2 :(得分:2)
.htaccess
拒绝访问它们(如果使用Apache)。readfile()
。答案 3 :(得分:0)
来自wordpress.stackexchange.com/a/285018
警告:警惕在较大的文件上使用这种PHP驱动的文件下载技术(例如,大小超过20MB)。为什么?有两个原因:
PHP有内部内存限制。如果readfile()
在将文件读入内存并将其提供给访问者时超过此限制,则您的脚本将失败。
此外,PHP脚本也有时间限制。如果连接速度很慢的访问者需要很长时间才能下载更大的文件,则脚本将超时,用户将遇到下载尝试失败或接收部分/损坏的文件。
警告:另请注意,使用readfile()
技术下载PHP驱动的文件不支持可恢复的字节范围。因此暂停下载或以某种方式中断下载不会让用户有一个恢复选项。他们需要重新开始下载。可以在PHP中支持Range请求(resume),但这是tedious。
从长远来看,我的建议是你开始考虑一种更有效的服务受保护文件的方式,在Apache中称为X-Sendfile,在Nginx中称为X-Accel-Redirect。
X-Sendfile和X-Accel-Redirect都适用于相同的基础概念。而不是要求像PHP这样的脚本语言将文件拉入内存,只需告诉Web服务器执行内部重定向并提供受保护文件的内容。简而言之,您可以取消上述大部分内容,并将解决方案缩减至header('X-Accel-Redirect: ...')
。