【发布时间】:2021-03-31 09:11:20
【问题描述】:
我正在使用 Laminas (Zend) 框架。我为每个客户创建了一个用于存储文档的文件夹。由于用户只能访问公共文件夹,我如何让用户访问存储在他/她的文件夹中的文档?我可以想到的一种方法是创建符号链接,但我没有 创建动态符号链接的诀窍?请告知任何其他选项。
【问题讨论】:
标签: apache zend-framework laminas
我正在使用 Laminas (Zend) 框架。我为每个客户创建了一个用于存储文档的文件夹。由于用户只能访问公共文件夹,我如何让用户访问存储在他/她的文件夹中的文档?我可以想到的一种方法是创建符号链接,但我没有 创建动态符号链接的诀窍?请告知任何其他选项。
【问题讨论】:
标签: apache zend-framework laminas
您可以通过控制器操作提供文件
class FilesControler extends Laminas\Mvc\Controller\AbstractActionController;
public function fileAction()
{
//TODO get userDir from identity
$filename= $userDir.$this->param()->fromQuery('file');
if (file_exists($filename))
{
$ext = substr($filename, - 3, 3);
if ($ext == 'pdf')
{
header('Content-Type: application/pdf');
}
else
{
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Length: ' . filesize($filename));
}
header('Content-Description: File Transfer');
header('Pragma: public');
readfile($filename);
}
else
{
header("HTTP/1.0 404 Not Found");
echo "404 Not Found. $filename";
}
return $this->response;
}
你也可以这样定义路线
[
'assets' => [
'type' => Segment::class,
'options' => [
'route' => '/file[/:d1][/:d2][/:d3][/:d4][/:d5][/:d6][/:d7][/:d8][/:d9]/:basename',
'defaults' => [
'controller' => Controller\FilesController::class,
'action' => 'file'
]
]
]
然后从路由参数连接文件路径
$directories = [];
for ($i = 1; $i < 9; ++ $i)
{
$dir = $this->params('d' . $i);
if ($dir)
$dirs[] = $dir;
else
break;
}
$basename = $this->param('basename');
$filename = implode('/', $dirs) . '/' . $basename;
URI 会更自然,但你必须限制目录的深度。
【讨论】: