使用Yii无法写入mPDF临时文件

问题描述 投票:1回答:4

我试图用PDF打印证书,但是当我将我的代码推送到分期时,它说

Temporary files directory "/var/www/protected/vendor/mpdf/mpdf/src/Config/../../tmp" is not writable

我不知道如何更改权限以及如何更改自定义目录。

这是我点击获取证书的按钮代码:

 <a class="btn btn-sd btn-sd-ghost btn-sd-ghost-black margin-right-lg" href="<?php echo $this->createUrl('//idea/frontend/pdf', array('id'=>$model->id))?>" target="_blank">Get Your Certificate<i class="icon-right-small"></i></a> 
            <?php endif; ?>

这是控制器:

public function actionPdf($id){
        $model = HUB::getOrganization($id);
        $orgtitle = $model->title;

        $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4-L']);
        $mpdf->WriteHTML("<html><body style='background-image:url(\"/images/cert-idea.jpg\"); background-image-resize: 5; background-position: top center;'></body></html>");

        $mpdf->WriteHTML("<div style='text-align:center; display:table; height:100%; width:100%; padding-top:28%;'><h1 style='display:table-cell; vertical-align:middle; font-size:40px;'>".$orgtitle."</h1></div>");


        $mpdf->Output('IDEA-CERT-'.$orgtitle.'.pdf', 'I');
    }

希望有人可以帮助解决我的问题。谢谢!

php yii mpdf
4个回答
6
投票

尝试the documentation中所述的自定义临时目录:

建议通过tempDir配置密钥设置自定义临时目录。该目录必须具有写权限(建议使用模式775)。

<?php
$mpdf = new \Mpdf\Mpdf(['tempDir' => __DIR__ . '/custom/temp/dir/path']);

您可以更好地控制composer vendor-dir之外的目录的权限。

如果网络服务器用户(通常是www-data)必须访问该目录,则模式775可能是不够的。必要时使用777。

请注意,mPDF会自动清除其临时目录,因此请使用专用于mPDF的目录。


2
投票

您可以使用以下命令更改文件权限: chmod 777 /var/www/protected/vendor/mpdf/mpdf/tmp 但这将允许该计算机上的任何人访问该文件,因此可能不是一个好主意。它会给你一个起点,如果这有效,你知道问题是文件权限。

如果您不是该文件的所有者,则可能需要以超级用户身份运行它

更好的解决方案是将所有者更改为服务器运行的进程, chown www-data: /var/www/protected/vendor/mpdf/mpdf/tmp 更改www-data以保存文件的进程。

奇怪的是,试图将pdf保存到该目录,你使用的是Kartik的mPDF吗?默认配置是将文件内联发送到浏览器,如果您在全局或创建窗口小部件时更改了配置,则应该只尝试保存文件:

'destination' => ['Pdf::DEST_FILE', '../../tmp']

如果是这种情况,那么最好将配置为您需要的任何选项,可能是Pdf::DEST_BROWSER(默认)或Pdf::DEST_DOWNLOAD强制下载而不提示用户。

将pdf保存为应用程序所在目录中的文件并不是很有意义,除非您只打算将开发计算机用作客户端,否则无法确定其他客户端的文件夹结构是什么样的,所以它是让他们的浏览器决定如何处理文件要好得多。


0
投票

提供可写的临时目录至关重要。最佳解决方案是使用OS提供的临时空间。

$mpdf = new \Mpdf\Mpdf(['tempDir' => sys_get_temp_dir().DIRECTORY_SEPARATOR.'mpdf']);

-2
投票

试试这个(XAMPP / LAMPP Ubuntu)

  • 打开终端然后设置为超级用户(su)
  • 从sudo-tmp复制并粘贴
sudo chmod 777 -R /opt/lampp/htdocs/phpdasar/pertemuan21/vendor/mpdf/mpdf/tmp
sudo chown -R sahrulsidik /opt/lampp/htdocs/phpdasar/pertemuan21/vendor/mpdf/mpdf/tmp
© www.soinside.com 2019 - 2024. All rights reserved.