Задать вопрос
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);


Заранее всем неравнодушным спасибо!
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Как то очень... легаси. Зачем отправлять файл через хэдеры? Отправляйте ссылку на файл и через js уже дергайте его из папки.

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

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

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

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

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