现在一般的php开发框架的目录结构本身就是按这个原则设计的。
那么开发人员怎么处理文件的下载呢?
第一种方式是使用php框架的Controller来实现文件下载(这样性能和效率差)。
第二种方式是直接使用nginx来进行下载(性能和效率高,但缺少权限验证)。
第三种方式php框架的Controller来验证权限,然后通过nginx来直接下载文件。(折中的处理,两头兼顾)
1,第一种方式,直接利用php代码实现文件下载
CodeIgniter4 的框架中提供了相关功能的实现,我只需要进简单调用即可。
Response 的 download 方法
下面的代码实现内存数据作为文件下载:
$data是下载的实际数据, $name是提供可客户端的文件名。
下面的代码实现磁盘文件的直接下载:
将第二参数设置为null即可。 这样实际文件名也会默认发送给客户端。
安全起见,我们需要修改文件名:
后面 setFileName 设置的文件名会实际发送给客户端。
Response 的 download 方法
下面的代码实现内存数据作为文件下载:
[复制到剪贴板] |
$data = 'Here is some text!';
$name = 'mytext.txt';
return $this->response->download($name, $data);
$data是下载的实际数据, $name是提供可客户端的文件名。
下面的代码实现磁盘文件的直接下载:
[复制到剪贴板] |
return $this->response->download('/path/to/photo.jpg', null);
将第二参数设置为null即可。 这样实际文件名也会默认发送给客户端。
安全起见,我们需要修改文件名:
[复制到剪贴板] |
return $this->response->download('/path/to/photo.jpg', null)->setFileName('logo.jpg');
后面 setFileName 设置的文件名会实际发送给客户端。
2,第二种方式,直接利用nginx的路径配置,直接提供文件下载
例如:网站跟目录是 /var/www/public/
上传目录是 /var/www/writeable/uploads
用户下载url是 https://www.rickw.cn/uploads/path-to-file
nginx配置如下(两种配置方式):
上面两种配置方式都可以,第一种比较简单。(但要求url路径uploads和文件夹路径uploads必须一样)
第二种方式更灵活。url路径名和文件名可以不一样。
例如为了安全起见,我们要隐藏实际上传文件夹名称。将实际文件名改为:rickuploads,
同时又要不改变url的路径。按如下配置即可:
我们只需要修改 root对应的物理路径即可。
上传目录是 /var/www/writeable/uploads
用户下载url是 https://www.rickw.cn/uploads/path-to-file
nginx配置如下(两种配置方式):
[复制到剪贴板] |
location /uploads/{
root /var/www/writeable/;
}
[复制到剪贴板] |
location /uploads/{
root /var/www/writeable/uploads/;
rewrite ^/uploads/(.*)$ /$1 break;
}
上面两种配置方式都可以,第一种比较简单。(但要求url路径uploads和文件夹路径uploads必须一样)
第二种方式更灵活。url路径名和文件名可以不一样。
例如为了安全起见,我们要隐藏实际上传文件夹名称。将实际文件名改为:rickuploads,
同时又要不改变url的路径。按如下配置即可:
location /uploads/{
root /var/www/writeable/rickuploads/;
rewrite ^/uploads/(.*)$ /$1 break;
}
root /var/www/writeable/rickuploads/;
rewrite ^/uploads/(.*)$ /$1 break;
}
我们只需要修改 root对应的物理路径即可。
3,第三种方式,利用php验证权限,然后让nginx直接提供文件下载
这种方式功能上比较平衡。
除此之外还能实现下载链接保护,临时链接、链接有效期等特殊效果。
具体实现方式下回分解。
除此之外还能实现下载链接保护,临时链接、链接有效期等特殊效果。
具体实现方式下回分解。