PhpSpreadsheet返回文件而不是保存它

时间:2018-05-13 18:45:22

标签: php phpspreadsheet

我已经生成了xmlx文件,我可以保存它并通过以下方式为用户提供:

$writer->save('hello world.xlsx');
header('Location: hello world.xlsx');

然而,文件仍保留在硬盘上。我需要摆脱它,因为它是一种安全威胁。

我尝试取消链接文件

unlink('hello world.xlsx');

但是会将文件删除到早期,因此用户无法访问该文件。 如果它可以使用取消链接,那么我需要确保该文件将被删除(正确使用die();等)

修改 这不仅仅是出于安全原因。提供者不允许保存文件,因此这是唯一的方法。

4 个答案:

答案 0 :(得分:3)

使用php://output

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="file.xls"');
$writer->save("php://output");

答案 1 :(得分:1)

您可以在创建文件后直接发送文件,而不是重定向到文件。

$filename = 'hello world.xlsx';
$writer->save($filename);

// Set the content-type:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Length: ' . filesize($filename));
readfile($filename); // send file
unlink($filename); // delete file
exit;

答案 2 :(得分:0)

致电ob_end_clean();就在$ writer-> save('php:// output')之前。

ob_end_clean();
$ writer-> save('php:// output');

答案 3 :(得分:0)

您可以使用内存文件指针并从中读取。

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');

$fp = fopen("php://memory", "rw");
$writer->save($fp);
rewind($fp);

$contents = "";
while (!feof($fp)) {
    $contents .= fread($fp, 8000);
}