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

Posted

技术标签:

【中文标题】使用 Yii 无法写入 mPDF 临时文件【英文标题】:mPDF temporary file is not writable using Yii 【发布时间】:2018-02-01 02:32:59 【问题描述】:

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

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

【问题讨论】:

你用的是yii1还是yii2?你在用Kartik's mPDF extension吗?您是否在app/config/web 中设置了任何配置选项? 解决方案:我正在使用这种方式$mpdf = new \Mpdf\Mpdf(['mode' =&gt; 'utf-8', 'format' =&gt; 'A4-L', 'tempDir'=&gt;Yii::getPathOfAlias('application.runtime')]); 您的解决方案看起来与@Finwe 的答案非常相似。如果那是帮助您解决问题的原因,您可以将他的答案标记为已接受,否则请编写您自己的答案并接受(您需要等待 48 小时) 【参考方案1】:

尝试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 作为文件保存在应用程序所在的目录中并没有真正意义,除非您只打算将开发中的计算机用作客户端,否则无法判断其他客户端的文件夹结构是什么样的所以最好让他们的浏览器决定如何处理文件。

【讨论】:

您好,谢谢您的回答。我通过使用这个$mpdf = new \Mpdf\Mpdf(['mode' =&gt; 'utf-8', 'format' =&gt; 'A4-L', 'tempDir'=&gt;Yii::getPathOfAlias('application.runtime')]); 找到了方法【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

更改权限后出现正常错误无法正常工作【参考方案5】:

试试这个(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

【讨论】:

请解释您建议的命令的用途,以及它们如何解决 OP 的问题。 绝不,绝不,除非您知道自己在做什么,否则授予文件夹 777 权限。

以上是关于使用 Yii 无法写入 mPDF 临时文件的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 mpdf 临时文件目录可写问题?

mPDF SetSourceFile - 从临时存储中导入 PDF

如何解决postgresql中的“无法写入临时文件块:设备上没有剩余空间”?

错误:无法写入临时文件的块 37583345:设备上没有剩余空间

从 s3 获取数据并写入文件后无法从文件中读取数据

病毒扫描程序锁定和删除临时文件 - 应对它们的最佳方法?