Symfony2: 在浏览器中打开PDF文件

3
在我的Symfony 2项目中,当用户点击查看pdf文件的链接时,我希望在浏览器中显示pdf。pdf文件包含在我的“views”文件夹中,其中有一个名为“pdf-files”的子文件夹。
我需要如何修改以下控制器函数,以便在浏览器中显示pdf文件?
/**
 * @Route("/pdf/{pdfFilename}")
*/
public function pdfAction($pdfFilename) {
   return $this->render('@App/pdf-files/'.$pdfFilename);
}
3个回答

4

这个问题涉及到http请求的content-type头部信息。所以只需要设置它:

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

return $response;

3
为了提供静态文件,您可能需要使用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? - Max
检查我的编辑 - 我使用KernelInterface来定位您的资源。 - Tomasz Madeyski
使用您的代码,我得到以下错误消息:“Bundle“App”不存在或未启用。也许您忘记在AppKernel.php文件的registerBundles()方法中添加它了?”为什么它没有被识别?在我的视图文件夹中使用@App路径可以用于呈现twig文件。 - Max
请检查我的编辑 - 您需要使用“资源”文件夹。 - Tomasz Madeyski

0

在这里借鉴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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接