欢迎光临 Rick 's BLOG
日志首页  | C# .Net编程  | 原创作品  | 生活点滴  | C\C++相关  | 多媒体相关※ERMP  | VB相关  | 其它运维与编程  |  留言簿
C#同步代码中调用async异步方法.Result等待导致阻塞死锁deadlock的问题 php nodejs 获取网站图标的不同方法
未知   在CodeIgniter4中实现文件下载权限验证并利用nginx高效处理
[ 发布日期:11个月前 (12-18) ]   [ 来自:本站原创 ] [分类:其它运维与编程]
在上一会的文章 在CodeIgniter4中实现文件下载,以及nginx实现上传文件夹名的重写 中我们介绍了文件下载的几种实现方式。
这一回介绍第三种方式。

这里主要用到了nginx的XSendfile功能,这样效率比php的readfile要高。

要使用这个功能首先需要配置nginx:
# nginx 配置
location /check_download {
    internal; # 这个设置是必需的
    alias /var/www/uploads; # 文件所在真实路径
}

这里使用了 internal 设置,这个设置标明该url无法通过浏览器直接访问。
但是可以通过XSendfile功能访问。

然后,我们需要在php中拦截文件下载处理,并进行权限验证:
首先我们根据下载文件的目录名,在CodeIgniter4添加一个控制器。
例如你的下载目录是 /uploads/.......
这样新建一个控制器  Uploads 就行了。 在控制器的默认方法中进行权限验证,然后调用XSendFile即可。
[复制到剪贴板]

public function getIndex(...$param)
//首先根据 $param 构造文件名
//文件名只有 Uploads 后面的部分。
$subfn implode('/'$param);
//这里是附件实际路径,通常这个路径应该放在参数配置中
$fn '/var/www/uploads/' $subfn;

if (!
is_file($fn)) {
    return 
$this->response->setStatusCode(404'文件不存在');
}

////////////////////////////////////////////////////////
// 模拟校验下载权限
//....
$canDownload rand(110) > 5;
//...在这里添加你的实际权限判断逻辑
//...

//////////////////////////////////////////
//最后根据权限结果处理
if ($canDownload) {
    
//这里使用nginx的XSendfile功能
    
return $this->response->setHeader('X-Accel-Redirect: /check_download/' $subfn);
} else {
    return 
$this->response->setStatusCode(404'无权限');
}
 



引用通告地址 (0):
复制引用地址https://www.rickw.cn/trackback/311
复制引用地址https://www.rickw.cn/trackback/311/GBK
[ 分类:其它运维与编程  | 查看:557 ]

暂时没有评论,快来发表一个评论吧。
发表评论
作者:   用户:[访客] 
评论:

表  情
禁止表情 | 禁止UBB | 禁止图片 | 识别链接
对不起,你没有权限上传附件!
验证:
 
PoweredBy R-Blog V1.00 © 2004-2024 WWW.RICKW.CN, Processed in second(s) , 7 queries    京ICP备17058477号-5