我正在使用 Laminas (Zend) 框架。我为每个客户创建了一个用于存储文档的文件夹。由于用户只能访问公共文件夹,我如何让用户访问存储在他/她的文件夹中的文档?我可以想到的一种方法是创建符号链接,但我不知道如何创建动态符号链接?请告知任何其他选择。
问问题
38 次
1 回答
0
您可以从控制器操作中提供文件
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 会更自然,但你必须限制目录的深度。
于 2021-04-17T15:39:34.240 回答