允许登录用户在PHP中下载文件,否则没有人不能

时间:2011-04-28 03:40:53

标签: php

我的网站上有.mp3文件,我想设置我的网站,以便在我的用户登录后可以下载文件。如果用户未登录,则无法下载文件。我不希望任何人能够找到文件的路径。

4 个答案:

答案 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)

  • 将MP3文件放在docroot上方,或者如果不可能,则使用.htaccess拒绝访问它们(如果使用Apache)。
  • 验证用户是否已登录。
  • 当用户请求文件时,在MP3上发送相应的标题和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: ...')