На клиенте заполняется форма и аяксом данные отправляются на сервер, где формируется документ и отправляется обратно клиенту.
Код сервера:
// Валидация входящих данных
$php_word = new \PhpOffice\PhpWord\PhpWord();
$section = $php_word->addSection(array('orientation' => 'landscape'));
// Формирование документа
header('HTTP/1.0 201 Created');
header('Content-Disposition: attachment; filename=test.docx');
header('Content-Transfer-Encoding: binary');
$wr = \PhpOffice\PhpWord\IOFactory::createWriter($php_word, 'Word2007');
$wr->save('php://output');
Код клиента:
var xhr = new XMLHttpRequest()
xhr.open('GET', base_url('myserv'))
// xhr.responseType = 'blob'
xhr.send()
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status === 201) {
var size = Number(xhr.getResponseHeader('Content-Length'))
var blob = new Blob([xhr.response], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // переделать на данные из Content-Disposition
size: size
})
var url = window.URL.createObjectURL(blob)
createLinkAndClick(url)
} else if(xhr.status === 400) {
// novalid
}
}
}
createLinkAndClick() просто создает ссылку, заполняет href и имитирует click() по которому происходит загрузка файла.
Дело в том, что если раскомментировать
xhr.responseType = 'blob'
и передать xhr.response аргументом в
window.URL.createObjectURL()
вместо blob, то скачанный файл корректно откроется, а если формировать ObjectURL из blob, который у меня в коде то файл открывается с ошибкой "Не удалось открыть файл из за ошибок его содержимого".
Как правильно сформировать Blob javascript-ом для передачи его в createObjectURL?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости