【问题标题】:Symfony2: Open PDF file in browserSymfony2:在浏览器中打开 PDF 文件
【发布时间】:2015-11-23 10:15:07
【问题描述】:

在我的 Symfony 2 项目中,当用户单击查看 pdf 文件的链接时,我想在浏览器中显示 pdf。 pdf 文件包含在我的“views”文件夹中,在一个名为“pdf-files”的子文件夹中。

我需要如何调整以下控制器功能,以便在浏览器中显示 pdf 文件?

/**
 * @Route("/pdf/{pdfFilename}")
*/
public function pdfAction($pdfFilename) {
   return $this->render('@App/pdf-files/'.$pdfFilename);
}

【问题讨论】:

    标签: php symfony pdf


    【解决方案1】:

    要提供静态文件,您可能需要使用BinaryFileResponse 类。在这样的响应中,您可以设置content disposition - 该文件应该在浏览器中打开还是作为附件下载。

    所以你的代码应该是这样的:

    public function pdfAction($pdfFilename)
    {
       $kernel = $this->get('kernel');
       $path = $kernel->locateResource('@AppBundle/Resources/pdf-files/'.$pdfFilename);
    
       $response = new BinaryFileResponse($path)
    
       $response->headers->set('Content-Type', 'application/pdf');
       $response->setContentDisposition(
          ResponseHeaderBag::DISPOSITION_INLINE, //use ResponseHeaderBag::DISPOSITION_ATTACHMENT to save as an attachement
          $pdfFilename
       );
    
       return $response;
    }
    

    编辑: 因为locateResource 默认在Resources 目录下寻找文件,我建议将pdf-files 目录从views 目录移动到Resources

    【讨论】:

    • 谢谢,但您的变量 $path 从未使用过。 $path = $file?
    • 检查我的编辑 - 我使用 KernelInterface 来定位您的资源
    • 使用您的代码,我收到以下错误消息:“Bundle "App" 不存在或未启用。也许您忘记在 AppKernel.php 的 registerBundles() 方法中添加它文件?”怎么不被认出来?使用 @App 路径可以在我的视图文件夹中渲染树枝文件。
    • 检查我的编辑 - 你需要使用Resources文件夹
    【解决方案2】:

    这都是关于 http 请求的内容类型标头。所以只需设置它:

    $response = $this->render('@App/pdf-files/'.$pdfFilename);
    $response->headers->set('Content-Type', 'application/pdf');
    
    return $response;
    

    【讨论】:

      【解决方案3】:

      从 Tomasz 的回答中获取帮助是使其工作的另一种方法,在这种情况下,它让您从资产目录中读取文件。这适用于 Symfony 4 及更高版本。

          //Imports used
          use Symfony\Component\Asset\Package;
          use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
          use Symfony\Component\HttpFoundation\BinaryFileResponse;
          use Symfony\Component\HttpFoundation\ResponseHeaderBag;
      
      
          $package = new Package(new EmptyVersionStrategy());
          $path = $package->getUrl('assets/pdf/pdffilename.pdf');
          $response = new BinaryFileResponse($path);
      
          $response->headers->set('Content-Type', 'application/pdf');
          $response->setContentDisposition(
              ResponseHeaderBag::DISPOSITION_INLINE,
              "pdf-name-at-the-time-of-download.pdf"
          );
      
          return $response;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 2011-06-12
        • 2017-01-01
        • 2019-01-04
        相关资源
        最近更新 更多