2012-07-13 21 views
6

Próbuję użyć PHPWord do generowania dokumentów Word. Dokument można wygenerować z powodzeniem. Ale jest problem, w którym mój wygenerowany dokument tekstowy zostanie zapisany na serwerze. Jak mogę udostępnić go do natychmiastowego pobrania?Automatyczne pobieranie załącznika przy użyciu PHPWord

Próbka:

$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. 

Jak mogę połączyć się z nagłówka, aby pobrać go w następujący sposób:

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

Prosimy powiadomić.

Odpowiedz

8

php://output to strumień tylko do zapisu, który zapisuje się na ekranie (np. echo).

Tak więc, $document->save('php://output'); nie zapisze pliku w dowolnym miejscu na serwerze, spowoduje jedynie wyświetlenie go.

Wydaje się, $document->save, nie obsługuje obwolut strumieniowych, więc dosłownie utworzył plik o nazwie "php://output". Spróbuj użyć innej nazwy pliku (sugeruję plik tymczasowy, ponieważ chcesz go tylko odtworzyć).

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

W header pole filename co PHP informuje przeglądarkę, plik o nazwie, to nie musi być nazwa pliku na serwerze. To tylko nazwa, którą przeglądarka zapisze jako.

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

więc wprowadzenie go wszystkie razem:

$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 
+0

Cześć to rzeczywiście zapisać go do mojego katalogu doc. I kiedy nazwałem nazwę pliku dla załącznika nagłówka. Udaje się pobrać, ale zawartość jest pusta w środku. – JLearner

+0

@JLearner: Ah, ok. Rozumiem, co się dzieje. '$ document-> save' nie obsługuje owijaczy strumieniowych, więc tworzy plik o nazwie dosłownie' 'php: // output" '. Zmień to na inną nazwę pliku, a następnie użyj 'echo file_get_contents ('nazwa_pliku.docx')', aby wyświetlić ją w przeglądarce. –

+0

echo the file_ge_contents w części nagłówka? lub? – JLearner

8
$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; 
+0

Próbowałem twojego kodu, ale dla każdej linii nagłówka jest napisane "nagłówek już wysłany" - ostrzeżenie. Następnie drukuje dziwne symbole, takie jak ' % t E tw t (t t Ew' na moją konsolę sieciową w przeglądarce – moody

0

Niestety to przyszedł później. Natknąłem się na to, próbując rozwiązać ten sam problem. Udało mi się uruchomić go na Laravel 5 używając:

$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); 
    } 

Mam nadzieję, że komuś pomogło !!!

1
// Save File 
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007'); 
header("Content-Disposition: attachment; filename='myFile.docx'"); 
$objWriter->save("php://output"); 
+0

Witam. Gratuluję pierwszego postu. Czy możesz podać dodatkowy tekst wyjaśniający, co robi twoja odpowiedź? –

+0

pobierz załącznik pliku jako docx :) – burrotauro

1

teraz odrobina Ver 0.13.0 https://github.com/PHPOffice/PHPWord

<? 
require_once "../include/PHPWord-develop/bootstrap.php"; 

$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('template.docx'); 

$templateProcessor->setValue('var01', 'Sun'); 
$templateProcessor->setValue('var02', 'Mercury'); 

//##################################################### 
// Save File 
//##################################################### 
//##################################################### 
header("Content-Disposition: attachment; filename='output01.docx'"); 
    $templateProcessor->saveAs('php://output'); 
//##################################################### 
//##################################################### 
?> 
1

Jest to praca dla mnie:

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007', $download = true); 

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

$objWriter->save("php://output"); 
Powiązane problemy