PHPOffice 写入新文件时出现致命错误

PHPOffice write a new file fatal errors

我正在使用 this 库从我的 PHP 脚本创建 .xlsx 文件。

按照 this 指南,我尝试将一些数据导出到名为 hello.xlsx.

的文件中

但是,此错误会显示以下消息:

Warning: ZipArchive::close(): Failure to create temporary file: Permission denied in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer

Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399

PhpOffice\PhpSpreadsheet\Writer\Exception: Could not close zip file hello.xlsx. in /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 399

该文件在执行前不存在,所以我得到了一些错误。我总是可以尝试 touch hello.xlsx 并更改我的脚本以读取该文件并附加数据,但实际上,每次脚本为 运行.[=25= 时我都在尝试编写一个新文件]

这是我的(简化)代码:

require_once 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$sheet->setCellValue('A1', 'foo');
$sheet->setCellValue('B1', 'bar');
$sheet->setCellValue('C1', 'foobar');
$sheet->setCellValue('D1', 'trey is the best');

$writer = new Xlsx($spreadsheet);
$writer->save('hello.xlsx');

转到错误中的那些行显示此代码片段:

// Close file
if ($zip->close() === false) {
    throw new WriterException("Could not close zip file $pFilename.");
}

对我来说,这并不是一条有用的消息来调试问题所在。

我在这方面找到了各种 SO 帖子:

很遗憾,已接受的答案无效(将代码更改为 $writer->save($_SERVER['DOCUMENT_ROOT']. '/hello.xlsx'))。

我也尝试了 SaveFiaTempFile 函数,但它只会输出一堆有趣的字符。

我也不想将我的 folder/file 权限设置为 777,因为这在膜中太疯狂了。

这个被接受的答案并没有真正表明除了改变所有权之外,IMO 应该做的正确的事情是什么,但是..把什么变成什么?

那么我该如何解决 fixing/debugging 这个没有太多要继续下去的问题呢?

谢谢:)

更新

所以我想我应该仔细检查一下,我在 project_root 中创建了一个名为 tmp 的文件夹。我更改了我的代码以写入 $_SERVER['DOCUMENT_ROOT']. '/tmp/hello.xlsx',但它仍然给出错误。

然而,我想“嘿,让我们开个玩笑吧”,令我惊讶的是数据都在那里,一切似乎都很好..但无论出于什么原因,它仍然收到错误,而不是在我的浏览器中出现下载弹出窗口..

我找到了创建动态 Xlsx 文件的解决方案:

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="hello.xlsx"');
header('Cache-Control: max-age=0');

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

在这里,我们实际上只是将浏览器重定向到 php://output 并下载文件。