Задать вопрос
@bisswan

Ошибка при вызове окна сохранения, как решить?

Суть вопроса: Создаю сначала docx файл с данными, после чего пытаюсь вызвать окно сохранения, для скачивания данного файла пользователю на пк, но выдает ошибку, подскажите как это можно переделать? Может быть можно обойтись без сохранения файла на сервере а сразу на пк пользователя можно?
<?php 
if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['someAction']))
{
    printdoc();
}
function printdoc()
{

    $mysql = new mysqli('localhost', 'root', '', 'kontakt');
    $idproduct = $_POST['id_product'];
    require_once 'vendor/autoload.php';
    $phpWord = new  \PhpOffice\PhpWord\PhpWord(); 
    $_doc = new \PhpOffice\PhpWord\TemplateProcessor('./product.docx');
    
    $uploadDir = __DIR__;
    

    //$uploadfile = $uploadDir . "\assets\img\product\\" . basename($_FILES['fileimage']['name']);
   // echo $uploadfile;
   // move_uploaded_file($_FILES['fileimage']['tmp_name'], $uploadfile);
    $outputFile = 'product_' . $idproduct . '.docx';

    $result3 = $mysql->query("SELECT * from `catalog` where `id_product` = '$idproduct' ");
    $contentonprint = $result3->fetch_assoc();

    $id_product = $contentonprint['id_product'];
    $id_post = $contentonprint['id_post'];
    $Name_product = $contentonprint['Name_Product'];
    $Operator = $contentonprint['Operator'];
    $Internet = $contentonprint['Internet'];
    $Minuts = $contentonprint['Minuts'];
    $Sms = $contentonprint['Sms'];
    $Price_tarif = $contentonprint['Price_tarif'];
    $Price_sim = $contentonprint['Price_sim'];
    $Image = $uploadDir . $contentonprint['image'];
    
    

    $_doc->setvalue('id_product',$id_product);
    $_doc->setvalue('id_post',$id_post);
    $_doc->setvalue('Name_product',$Name_product);
    $_doc->setvalue('Operator',$Operator);
    $_doc->setvalue('Internet',$Internet);
    $_doc->setvalue('Minuts',$Minuts);
    $_doc->setvalue('Sms',$Sms);
    $_doc->setvalue('Price_tarif',$Price_tarif);
    $_doc->setvalue('Price_sim',$Price_sim);
    //$_doc->setImageValue('img_product',array('path'=>$Image));
    $_doc->setValue('img_product',$Image);
    $_doc->saveAs($outputFile);

    // имя файла, с которым он будет сохранен
    $file_name = $outputFile; 
    // путь до файла
    $file_path = $uploadDir;
    
    // код 200, все хорошо
    header("HTTP/1.1 200 OK"); 
    header("Content-type: docx"); // тип файла
    // дата по Гринвичу
    header('Expires: ' . gmdate('D, d M Y H:i:s') . 
    ' GMT'); 
    // определяем браузер
    $ua = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
    $isMSIE = preg_match('@MSIE ([0-9].[0-9]{1,2})@', $ua);
    if ($isMSIE){
        // если это Internet Explorer  
        // объясняем браузеру, что выводим файл
        header('
            Content-Disposition: attachment; filename="' . $file_name . '"'
        ); 
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
    }else{
        // если это НЕ Internet Explorer 
        // объясняем браузеру, что выводим файл
        header('Content-Disposition: attachment;filename="' . $file_name . '"');
        header('Pragma: no-cache');
    }


}
?>


6668f01c8db8e644528208.png
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Судя по скрину, у вас сначала выводится дофига контента, а затем вы пытаетесь отправить файл. Так как все заголовки уже отправлены, естественно никакие данные в заголовок посреди вывода контента уже не добавятся (о чем собственно и написано в варнинге).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Заголовки можно отправлять до вывода контента. используйте ob_ функции (ob_start/ob_get_clean) для буферизации вывода.

header("HTTP/1.1 200 OK"); - не нужен, отправляется автоматом
header("Content-type: docx"); - неверный тип
$result3 = $mysql->query("SELECT * from `catalog` where `id_product` = '$idproduct' "); - тут вообще молчу
Ответ написан
Ваш ответ на вопрос

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

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