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

时间:2018-02-01 02:32:59

标签: php yii mpdf

我尝试用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');
    }

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

4 个答案:

答案 0 :(得分:4)

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

  

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

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

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

如果Web服务器用户(通常为www-data)必须访问该目录,则模式775可能不够。如有必要,请使用777。

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

答案 1 :(得分: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保存为应用程序所在目录中的文件并不合理,除非您只打算将开发计算机用作客户端,否则无法判断其他客户端的文件夹结构是什么样的所以让他们的浏览器决定如何处理文件要好得多。

答案 2 :(得分:0)

提供可写的临时目录至关重要。最好的解决方案是使用操作系统提供的临时空间。

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

答案 3 :(得分:-1)

为(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