PhpSpreadsheet return 文件而不是保存它
PhpSpreadsheet return file instead of saving it
我已经生成了 xmlx 文件,我可以保存它并通过以下方式提供给用户:
$writer->save('hello world.xlsx');
header('Location: hello world.xlsx');
但是,文件仍保留在硬盘上。我需要摆脱它,因为它是一种安全威胁。
我尝试取消链接文件
unlink('hello world.xlsx');
但这会过早删除文件,因此用户无法访问它。
如果它可以与取消链接一起使用,那么我需要确保该文件将被删除(因此正确使用 die();
等)
编辑:
这不仅仅是出于安全原因。提供商不允许保存文件,因此这是唯一的方法。
您可以在文件创建后直接发送,而不是重定向到文件。
$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;
使用php://output
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="file.xls"');
$writer->save("php://output");
调用ob_end_clean();就在 $writer->save('php://output').
之前
ob_end_clean();
$writer->save('php://output');
您可以使用内存中的文件指针并从中读回。
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$fp = fopen("php://memory", "rw");
$writer->save($fp);
rewind($fp);
$contents = "";
while (!feof($fp)) {
$contents .= fread($fp, 8000);
}
我已经生成了 xmlx 文件,我可以保存它并通过以下方式提供给用户:
$writer->save('hello world.xlsx');
header('Location: hello world.xlsx');
但是,文件仍保留在硬盘上。我需要摆脱它,因为它是一种安全威胁。
我尝试取消链接文件
unlink('hello world.xlsx');
但这会过早删除文件,因此用户无法访问它。
如果它可以与取消链接一起使用,那么我需要确保该文件将被删除(因此正确使用 die();
等)
编辑: 这不仅仅是出于安全原因。提供商不允许保存文件,因此这是唯一的方法。
您可以在文件创建后直接发送,而不是重定向到文件。
$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;
使用php://output
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="file.xls"');
$writer->save("php://output");
调用ob_end_clean();就在 $writer->save('php://output').
之前ob_end_clean();
$writer->save('php://output');
您可以使用内存中的文件指针并从中读回。
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$fp = fopen("php://memory", "rw");
$writer->save($fp);
rewind($fp);
$contents = "";
while (!feof($fp)) {
$contents .= fread($fp, 8000);
}