Cakephp: mpdf хранит сгенерированный pdf в запрещенном каталоге

В моем приложении Cakephp 3.6 я использую mpdf для создания файлов PDF. Хотя на локальном хосте работает без проблем, когда я пробую его на сервере, я получаю эту ошибку:

SplFileInfo::isFile() [https://secure.php.net/splfileinfo.isfile'>splfileinfo.isfile]: действует ограничение open_basedir. Файл(/tmp/mysql.sock) не находится в разрешенных путях:

Это потому, что он пытается сохранить файл 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, то это сработает, но безопасно ли это делать?


person thelaw    schedule 18.10.2019    source источник


Ответы (2)


Установите временный каталог для записи PDF-файлов PHPSpreadsheet в место, к которому у вас есть доступ:

$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

person Finwe    schedule 22.10.2019

Установка 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 прямо в каталоге вашего приложения. Таким образом, ваше приложение src будет отделено от сгенерированных файлов.

person Szymon    schedule 18.10.2019