php - PhpSpreadsheet:权限 | ZipArchive::close(): 创建临时文件失败
问题描述
我想提供一个 Excel 文件以供下载 PhpSpreadsheet
这是我的代码:
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');
$writer = new Xlsx($spreadsheet);
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="hello_world.xlsx"');
$writer->save("php://output");
我收到以下错误消息:
PHP Warning: ZipArchive::close(): Failure to create temporary file: No such file or directory in /Users/sg/GitWorkingCopies/xxx1/xxx2/library/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php on line 374
PHP Fatal error: Uncaught exception 'PhpOffice\PhpSpreadsheet\Writer\Exception' with message 'Could not close zip file php://output.' in /Users/sg/GitWorkingCopies/xxx1/xxx2/library/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php:375
\PhpOffice\PhpSpreadsheet\Writer\Xlsx 在写入 php://output 时使用临时存储。默认情况下,临时文件存储在脚本的工作目录中。当没有访问权限时,它会回退到操作系统的临时文件位置。
upload_tmp_dir 是:/Applications/XAMPP/xamppfiles/temp/
我必须检查哪些文件夹权限?或者是什么导致了问题?
解决方案
PHP中目录写入的一般规则:
它必须存在,
它可由 PHP 进程写入,
open_basedir php.ini 指令允许它。
因此,在方法中设置一些文件路径作为参数,$writer->save()
并检查这三个规则是否满足。
如果您想在方法中使用 onlyphp://output
或php://stdout
value $writer->save()
,请检查以下规则:
1) 函数返回的目录sys_get_temp_dir()
。在 Windowssys_get_temp_dir()
中默认返回当前操作系统用户的临时目录。该值可以通过sys_temp_dir
php.ini 指令更改。
或者
2) upload_tmp_dir php.ini 指令返回的目录。$useUploadTempDirectory
默认有false
值。要设置它的值以true
在保存文件之前在代码中添加此行:
\PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory(true);
下面是负责选择保存路径的代码:
从\PhpOffice\PhpSpreadsheet\Writer\Xlsx::save
方法(来源):
// If $pFilename is php://output or php://stdout, make it a temporary file...
$originalFilename = $pFilename;
if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {
$pFilename = @tempnam(File::sysGetTempDir(), 'phpxltmp');
if ($pFilename == '') {
$pFilename = $originalFilename;
}
}
从\PhpOffice\PhpSpreadsheet\SharedFile::sysGetTempDir
方法(来源):
/**
* Get the systems temporary directory.
*
* @return string
*/
public static function sysGetTempDir()
{
if (self::$useUploadTempDirectory) {
// use upload-directory when defined to allow
// running on environments having very restricted open_basedir configs
if (ini_get('upload_tmp_dir') !== false) {
if ($temp = ini_get('upload_tmp_dir')) {
if (file_exists($temp)) {
return realpath($temp);
}
}
}
}
return realpath(sys_get_temp_dir());
}
推荐阅读
- android-fragments - xamarin 形式:将片段添加到 xaml
- java - Weblogic:DBMS 驱动程序异常是:I/O 错误:SSO 失败:未加载本机 SSPI 库。检查 java.library.path 系统属性
- c# - 如何在不满足 C#、ASP.NET CORE 中的特定条件的情况下显示列表中的所有项目?
- c# - 如何防止相机改变其尺寸?
- android - 使用 Windows 操作系统运行 appium 脚本时出现套接字挂起错误
- python - 如何从引用的行中正确替换文本中的行
- c# - ESI 编号的正则表达式
- network-programming - 对 LAN 中的 Windows 10 PC 上的网络连接进行故障排除
- angular - ng 命令给出错误,SyntaxError: Unexpected token )。7
- spring-boot - 用于 https 的 Spring MVC 中的 ResponseEntity