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
中所暗示
在我的 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
中所暗示