加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何让拥有所需权限的用户通过php下载文件?

发布时间:2020-12-13 16:28:46 所属栏目:PHP教程 来源:网络整理
导读:我有一个php文件,作为我希望人们下载的所有文件的守门人,谁有足够的特权. 我使用的代码将文件抛给用户 header('Content-Description: File Transfer');header('Content-Type: application/octet-stream');header("Content-disposition: attachment; filename
我有一个php文件,作为我希望人们下载的所有文件的守门人,谁有足够的特权.

我使用的代码将文件抛给用户

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-disposition: attachment; filename="".$public_filename."""); 
header("Content-Transfer-Encoding: Binary"); 
header('Expires: 0');
header('Cache-Control: must-revalidate,post-check=0,pre-check=0');
header('Pragma: public');
header("Content-length: ".$f_filesize); 
readfile($file_path);

大多数文件都相当大…… 400mb-10GB.

什么是一个很好的方法来做到这一点,并保持真正的位置文件名的秘密,所以人们不能直接链接到文件,但有必要通过我的download.php?file = ID网守链接?

谢谢

编辑:我不是问如何进行用户身份验证,所有这一切都已完成.我只是问我的做法,是一个大规模的好主意.如果我继续阅读10GB文件,它似乎可能会导致内存问题.

好吧,让php发送大约400Mb-10Gb的文件并不好.你需要以某种方式让你正在使用的任何网络服务器实际上提供文件.

这实际上归结为您需要它的安全性.想到的最简单的解决方案(但远非最安全的)是使用具有链接到原始文件的长随机名称的符号链接.一段时间后,符号链接将过期并被删除.每个用户都将自己的符号链接(或“令牌”)添加到他们正在下载的文件中.我不确定它在Windows环境中是如何发挥作用的,但是在unix上它无论如何都相当简单.

这是一些伪代码:

if($user->isAllowedToDownload($file)){
    $token = md5($user->name . $file->name . time() . $someGoodRandomValue);
    symlink($file,$download_path . $token);
    header("Location: $download_url$token"); 
}

然后你需要一个清除旧符号链接的cron作业.您还需要确保将Web服务器设置为遵循符号链接,最好仅限于创建这些下载令牌的文件夹.

因此,当用户可能请求domain.com/download?file=bigfile.mp4时,会在Web服务器公共空间中创建一个符号链接,该链接指向Web服务器公共空间之外的真实文件.用户可能会被重定向到domain.com/getFile/ab739babec890103bdbca72,这反过来会导致Web服务器为该文件提供服务.现在,用户很难尝试猜测文件的URL是什么,这就是“安全性”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读