0

我正在使用 Laminas (Zend) 框架。我为每个客户创建了一个用于存储文档的文件夹。由于用户只能访问公共文件夹,我如何让用户访问存储在他/她的文件夹中的文档?我可以想到的一种方法是创建符号链接,但我不知道如何创建动态符号链接?请告知任何其他选择。

4

1 回答 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 回答