Файл возврата PhpSpreadsheet вместо его сохранения

Я создал файл xmlx, и я могу сохранить его и предоставить пользователю через:

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

Однако после этого файл остается на жестком диске. Мне нужно избавиться от него, так как это угроза безопасности.

Я попытался отключить файл

unlink('hello world.xlsx');

но при этом файл удаляется слишком рано, поэтому у пользователя нет к нему доступа. Если он может работать с отключением связи, мне нужно быть уверенным, что файл будет удален (так что правильное использование die(); и т. Д.)

РЕДАКТИРОВАТЬ: Это больше не только по соображениям безопасности. Провайдер не позволяет сохранять файлы, так что это единственный выход.


person Brambor    schedule 13.05.2018    source источник


Ответы (4)


Используйте 1_

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="file.xls"');
$writer->save("php://output");
person Artyom Sokolov    schedule 13.05.2018
comment
Это не работает, поскольку возвращает то, что было бы на странице, а не то, что было бы в файле. Таким образом, вместо файла он возвращает случайное предупреждение. - person Brambor; 13.05.2018
comment
@Brambor, какое там предупреждение? - person Artyom Sokolov; 13.05.2018
comment
Это не связано, это было раньше, когда работало, Warning: date() expects parameter 2 to be integer, float given in "my_file_path"\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Writer\Xlsx\DocProps.php on line 148 - person Brambor; 13.05.2018
comment
По сути, он предлагает файл для сохранения. Этот файл представляет собой xls-файл с этим предупреждением в A2. Таким образом, это то, что будет на странице. - person Brambor; 13.05.2018
comment
@Brambor Я бы посоветовал сначала избавиться от предупреждений (т.е. исправить их), а затем снова попытаться сгенерировать файл. - person Artyom Sokolov; 13.05.2018
comment
Но это никак не связано! Я могу сгенерировать файл, полностью сохранить его, предоставив код и добавив в него заголовок! - person Brambor; 14.05.2018
comment
Когда я не использую сохраненный файл в качестве шаблона xmlx, предупреждение исчезает, и файл полностью пуст. Так что это не было связано, избавь бог от предупреждения. - person Brambor; 14.05.2018
comment
Вы были правы во всем. После того, как все предупреждения были подавлены, файл отображался нормально. Обычно вы не должны ничего повторять, если хотите использовать ошибку заголовка. - person Brambor; 14.05.2018
comment
Добавьте exit(); в конце, чтобы остальная часть страницы не загружалась. - person Shahlin Ibrahim; 26.03.2020
comment
При использовании этих настроек я получаю ошибку cors в laravel 7.34. Может быть, вы могли бы мне помочь, большое вам спасибо. - person JG_GJ; 25.05.2021
comment
@JG_GJ Рассмотрите возможность открытия нового вопроса с подробным описанием вашей настройки, пожалуйста, отметьте меня здесь. - person Artyom Sokolov; 25.05.2021

Вы можете отправить файл сразу после его создания вместо перенаправления на файл.

$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;
person Syscall    schedule 13.05.2018
comment
К сожалению, я обнаружил, что на сервере (в отличие от localhost) сохранение запрещено. - person Brambor; 14.05.2018

вызовите ob_end_clean (); непосредственно перед $ writer- ›save ('php: // output').

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

person Zaheer Babar    schedule 22.10.2020

Вы можете использовать указатель файла в памяти и читать из него.

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

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

$contents = "";
while (!feof($fp)) {
    $contents .= fread($fp, 8000);
}
person Rob Ryan    schedule 06.07.2021