PHPWord любой способ не записывать файл на диск при загрузке файла - PullRequest
0 голосов
/ 17 декабря 2018

Я использую PHPWord для создания документов Word, и я надеюсь, что кто-то может помочь в этом.Теперь, когда он настроен, ajax-запрос отправляется на мой сервер из браузера, запрашивающего сборку документа PHPWord.Документ создается и хранится в файле на сервере с таким кодом:

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$fileName = $picklistDetails['file_name'] . ".docx";
$filePath = '../users/' . $userId . "_word_" . $fileName;
$objWriter->save($filePath); 

Чтобы позволить пользователю загрузить файл, после успешного выполнения запроса ajax я использую window.location для отправки пользователюстраница, которая помещает текстовый документ вместе с этим (позволяя начать загрузку):

$fileName = $this->session->word_file_name;
$filePath = $this->session->word_file_path;

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=" . $fileName);
header("Content-Transfer-Encoding: binary");    
readfile($filePath);

Все это прекрасно работает, единственная проблема в том, что я действительно предпочел бы, чтобы файл не был сохранен на сервереперед загрузкой.Я исследовал PHPWord, и согласно этому сообщению ( Автоматическая загрузка файлового вложения с использованием PHPWord ) есть некоторые обсуждения того, как вы можете отправить файл в выходной поток php вместо записи его на диск, а потому что сборкадокумент word делается в ajax, а затем для загрузки используется отдельная страница, я не думаю, что это сработает.Я не прав?

Также в этом посте ( Сохранить сгенерированный файл в базе данных PHPWORD ) есть описание того, как сохранить его в БД, но все еще есть промежуточный этап файлана сервере, которого мне нужно избегать.

Есть ли способ изменить

$objWriter->save($filePath); 

, чтобы он не записывался на диск, а вместо этого сохранялся в переменную или что-то еще?Тогда я мог бы хранить в базе данных, где я мог бы зашифровать ее.

Любая помощь будет оценена.Я вроде начинающего программиста php, поэтому подробная помощь будет высоко ценится.хорошего дня.

1 Ответ

0 голосов
/ 17 декабря 2018

Должно быть так же просто, как сделать $objWriter->save("php://output");:

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$fileName = $picklistDetails['file_name'] . ".docx";
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=" . $fileName);
header("Content-Transfer-Encoding: binary");    
$objWriter->save("php://output");

Пропустить перенаправление полностью.Просто window.location прямо к приведенному выше коду ^, и файл должен загрузиться после завершения сборки.

...