Cakephp:mpdf 将生成的 pdf 存储在禁止目录中

Cakephp: mpdf stores generated pdf in forbidden directory

在我的 Cakephp 3.6 应用程序中,我使用 mpdf 创建 pdf 文件。虽然在本地主机上没有任何问题,但当我在服务器上尝试时出现此错误:

SplFileInfo::isFile() [https://secure.php.net/splfileinfo.isfile'>splfileinfo.isfile]: open_basedir restriction in effect. File(/tmp/mysql.sock) is not within the allowed path(s):

那是因为它试图将 pdf 文件保存在 src 文件夹下,而不是 webroot.

代码如下:(excel 生成器工作正常)

$inv = TableRegistry::get('invoices')->get($invoice->id);   
$inv->file_id = $newFile->id;
TableRegistry::get('invoices')->save($inv);
$writer = new Xlsx($spreadsheet);
$writer->save($folder->path.'/timologio'.$inv->invoice_no.'.xlsx');



//Save as Pdf, even though $folder->path is pointing under webroot, its trying to save it under src
$PdfWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf');
$PdfWriter->save($folder->path.'/timologio'.$inv->invoice_no.'.pdf');

如果我将 open_basedir{WEBSPACEROOT}{/}{:}{TMP}{/} 更改为 none 那么它可以工作但是这样做安全吗?

open_basedir 设置为 none 不是一个好主意。更好的选择是将您的特定存储目录添加到 open_basedir。您可以在 ini 文件中全局执行此操作,也可以在 apache 配置中按目录执行此操作(假设您使用的是 apache):

<Directory /var/www/example.domain> php_admin_value open_basedir /your/dir/here/:/another/dir/here </Directory>

此外,src 文件夹用于您的应用程序源文件,我不建议将生成的 pdf 存储在那里。相反,我会直接在您的应用程序目录中创建其他目录,为了举例,我们将其命名为 storage。这样您的应用程序源文件将与生成的文件分开。

将 PHPSpreadsheet PDF writer 的临时目录设置为您有权访问的位置:

$PdfWriter->setTempDir('path/to/your/temp/directory');
$PdfWriter->save($folder->path.'/timologio'.$inv->invoice_no.'.pdf');

https://github.com/PHPOffice/PhpSpreadsheet/issues/1123#issuecomment-523361110

中所暗示