dmitriy154
@dmitriy154
Голова, два уха

Как вызвать функцию после готовности файла на сервере (php)?

Суть вопроса, данные с сайта отправляются методом POST на сервер
На сервере с помощью библиотеки PhpOffice формируется файл docx
Если в файл docx не требуется загружать картинки, то с помощью функции readfile() все прекрасно работает, т.е. файл сразу скачивается, но, как только появилась необходимость добавлять картинки, скачивание файла docx не происходит (в консоле chrome в разделе Network - Response появляются куча символов, но скачивание не происходит), но файл прекрасно сохраняется на сервере с помощью функции saveAs.
Как я понимаю, файл docx не успевает сформироваться, код не асинхронный, не дожидается пока сформируется файл.
Вопрос, как правильно скачать файл после его готовности?
P.s. код файла php без особенностей:
<?php
require_once 'vendor/autoload.php';
$temp = new \PhpOffice\PhpWord\TemplateProcessor('./files/template_tp.docx');
use PhpOffice\PhpWord\Element\Table;
$data = $_POST['data'];
$d = json_decode($data, true);
/* .....код работы с $temp, имеются циклы for и foreach. Дабы не усложнять приведу фрагмент */
foreach ($_FILES["canvas_field"]["error"] as $key => $error) {
	if ($error == UPLOAD_ERR_OK) {
		$tmp_name = $_FILES["canvas_field"]["tmp_name"][$key];
		$name = $path . $_FILES["canvas_field"]["name"][$key];
		move_uploaded_file($tmp_name, "$name");
	}
}

$uploadFile = $uploadDir . '\\' . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile);

//сохраняем файл и пробуем скачать
$outputFile = 'raschet.docx';

$temp->saveAs($outputFile);

// Имя скачиваемого файла
$downloadFile = $outputFile;
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Length: ".filesize($downloadFile));
header("Content-Disposition: attachment; filename=".$downloadFile);  
readfile($downloadFile);
unlink($outputFile);


Заранее всем неравнодушным спасибо!
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ответы на вопрос 1
ddv88
@ddv88
Binance Futures
Как то очень... легаси. Зачем отправлять файл через хэдеры? Отправляйте ссылку на файл и через js уже дергайте его из папки.

Как я понимаю, файл docx не успевает сформироваться, код не асинхронный

Как раз таки если бы он был асинхронный, вы бы не смогли ждать выполнения saveAs().

Почему PhpWord не умеет бросать состояния (я чекнул документацию) это уже другой вопрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы