【问题标题】:How do I download document from a web page in Zend Framework如何在 Zend Framework 中从网页下载文档
【发布时间】:2021-03-31 09:11:20
【问题描述】:

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

【问题讨论】:

    标签: apache zend-framework laminas


    【解决方案1】:

    您可以通过控制器操作提供文件

    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 会更自然,但你必须限制目录的深度。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多