Общие правила для каталога в PHP, чтобы написать в него:
Он должен существовать ,
Этодоступен для записи в процессе PHP ,
Это разрешено директивой open_basedir php.ini.
Следовательно, укажите некоторый путь к файлу в качестве аргумента в методе $writer->save()
и убедитесь, что эти 3 правила соблюдены.
Если вы хотите использовать только значение php://output
или php://stdout
в $writer->save()
метод, проверьте эти правила для:
1) Каталог, возвращаемый функцией sys_get_temp_dir()
.В Windows sys_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());
}