Descarga automática del archivo adjunto utilizando PHPWord

Estoy tratando de usar PHPWord para generar documentos de Word. Y el documento se puede generar con éxito. Pero hay un problema donde el documento de palabra generado se guardará en el servidor. ¿Cómo puedo hacer que esté disponible para descargar de inmediato?

Muestra:

$PHPWord = new PHPWord(); //Searching for values to replace $document = $PHPWord->loadTemplate('doc/Temp1.docx'); $document->setValue('Name', $Name); $document->setValue('No', $No); $document->save('php://output'); //it auto save into my 'doc' directory. 

¿Cómo puedo vincular el encabezado para descargarlo de la siguiente manera?

 header("Content-Disposition: attachment; filename='php://output'"); //not sure how to link this filename to the php://output.. 

Consejo amable.

php://output es una secuencia de solo escritura, que escribe en su pantalla (como echo ).

Entonces, $document->save('php://output'); no guardará el archivo en ninguna parte del servidor, simplemente lo recuperará.

Parece, $document->save , no es compatible con las envolturas de flujo, por lo que literalmente creó un archivo llamado "php://output" . Intenta usar otro nombre de archivo (sugiero un archivo temporal, ya que solo quieres repetirlo).

 $temp_file = tempnam(sys_get_temp_dir(), 'PHPWord'); $document->save($temp_file); 

En el header , el campo de filename es lo que PHP le dice al navegador que el nombre del archivo es, no tiene que ser el nombre de un archivo en el servidor. Es solo el nombre con el que el navegador lo guardará.

 header("Content-Disposition: attachment; filename='myFile.docx'"); 

Entonces, poniéndolo todo junto:

 $PHPWord = new PHPWord(); //Searching for values to replace $document = $PHPWord->loadTemplate('doc/Temp1.docx'); $document->setValue('Name', $Name); $document->setValue('No', $No); // // save as a random file in temp file $temp_file = tempnam(sys_get_temp_dir(), 'PHPWord'); $document->save($temp_file); // Your browser will name the file "myFile.docx" // regardless of what it's named on the server header("Content-Disposition: attachment; filename='myFile.docx'"); readfile($temp_file); // or echo file_get_contents($temp_file); unlink($temp_file); // remove temp file 
 $objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); $filename = 'MyFile.docx'; $objWriter->save($filename); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$filename); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($filename)); flush(); readfile($filename); unlink($filename); // deletes the temporary file exit; 
 // Save File $objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); header("Content-Disposition: attachment; filename='myFile.docx'"); $objWriter->save("php://output"); 

ahora con Ver 0.13.0 https://github.com/PHPOffice/PHPWord

 setValue('var01', 'Sun'); $templateProcessor->setValue('var02', 'Mercury'); //##################################################### // Save File //##################################################### //##################################################### header("Content-Disposition: attachment; filename='output01.docx'"); $templateProcessor->saveAs('php://output'); //##################################################### //##################################################### ?> 

Esto es trabajo para mí:

 $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007', $download = true); header("Content-Disposition: attachment; filename='File.docx'"); $objWriter->save("php://output"); 

Lo siento, esto vino más tarde. Me tropecé con esto mientras trataba de resolver el mismo problema. Pude hacerlo funcionar en Laravel 5 usando lo siguiente:

  $file_dir = $template_upload_dir.DIRECTORY_SEPARATOR.'filename.docx'; $tags = array(); if (file_exists($file_dir)) { $templateProcessor = new TemplateProcessor($file_dir); $tags = $templateProcessor->getVariables(); $replace = array(''); $templateProcessor->setValue($tags, $replace); $save_file_name = $fullname.'-'.$inv_code.'-'.date('YmdHis').'.docx'; $templateProcessor->saveAs($save_file_name); return response()->download($save_file_name)->deleteFileAfterSend(true); } 

Espero que ayude a alguien !!!