Я использую phpWord для создания текстового документа на лету в php-скрипте, который вызывается с использованием XMLHttpRequest. Я отслеживаю ответ на запрос, а затем пытаюсь предложить пользователю загрузить или открыть файл. Мой код phpWord создает файл ОК (я могу открыть файл на сервере), и браузер предлагает пользователю открыть или сохранить файл, но загруженный файл каким-то образом поврежден. Выдает ошибку типа «Извините. Мы не можем открыть файл results.docx, потому что обнаружили проблему с его содержимым».
На стороне сервера у меня есть этот код:
...
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document' );
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
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);
На стороне клиента у меня есть этот код:
function getDOC()
{
url='services/doc_search_results_service.php/';
var req = null;
var postParms = '';
req = new XMLHttpRequest
if ( req )
{
req.open( 'POST', url, true );
req.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
req.setRequestHeader( "Content-length", postParms.length );
req.setRequestHeader( "Connection", "close" );
req.onreadystatechange = function()
{
if ( req.readyState == 4 && req.status == 200 )
{
downloadDOC( "results.docx", req.responseText );
}
}
req.send( postParms );
}
}
function downloadDOC(filename, text)
{
var pom = document.createElement('a');
pom.setAttribute('href', 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document,' + encodeURIComponent(text));
pom.setAttribute('download', filename);
document.body.appendChild(pom);
pom.click();
document.body.removeChild(pom);
}
Хотелось бы знать, если кто-нибудь может определить, где я иду не так. Я не эксперт в php и javascript, поэтому любая помощь будет принята с благодарностью. FWIW Я думаю, что это может быть связано с заголовками. Я также предполагаю, что это вполне может быть проблема на стороне клиента, так как файл создает ОК на стороне сервера.
Заранее спасибо. 🙂
Спасибо @Musa за предложение использовать «GET», а не «POST», который работал отлично.
Как предложил @Musa, клиентский javascript в этом примере должен быть:
window.location = 'services/doc_search_results_service.php/';
Который заменяет весь javascript, указанный в моем оригинальном вопросе.
Примечание. Я не уверен, каким был бы правильный ответ, если бы по какой-то причине было невозможно использовать GET.
Других решений пока нет …