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

dhxwm5r4  于 2022-11-09  发布在  其他
关注(0)|答案(6)|浏览(226)

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

希望有人能在我的问题上帮忙。谢谢!

rt4zxlrg

rt4zxlrg1#

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

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

5cg8jx4n2#

转到您的项目root路径(vendor文件夹所在的位置),然后运行

sudo chmod -R 777 vendor/mpdf/mpdf/tmp
mgdq6dx1

mgdq6dx13#

使用带有try的php tmp

try {
        $mpdf = new Mpdf([
            'tempDir' => '/tmp', // uses tmp to store PDF
        ]);
      } catch (\Mpdf\MpdfException $e) {
            // Return 500 if mPDF fails to create instance 
            $response->setMessage("Creating an mPDF object failed with" . $e->getMessage());
            $response->setStatusCode(500);
            return $response;
    }
2q5ifsrm

2q5ifsrm4#

在(XAMPP / LAMPP Ubuntu)中试用此功能

  • 打开终端,然后设置为超级用户(su)
  • 从sudo-tmp复制并粘贴bellow

第一个

uplii1fm

uplii1fm5#

尝试使用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的目录。

rfbsl7qr

rfbsl7qr6#

您可以使用以下命令更改文件权限:
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文件保存在应用程序所在的目录中并没有什么意义,除非你只打算将你的开发计算机用作客户端,因为没有办法知道其他客户端的文件夹结构会是什么样子,所以最好让他们的浏览器决定如何处理文件。

相关问题