使用phpWord下载docx文件损坏 - javascript客户端问题

时间:2015-01-17 23:07:31

标签: php content-type docx phpword

我正在使用phpWord在使用XMLHttpRequest调用的php脚本中动态创建word文档。我正在捕获对请求的响应,然后尝试提示用户下载或打开该文件。我的phpWord代码创建文件OK(我可以在服务器上打开文件),浏览器提示用户打开或保存文件,但下载的文件以某种方式损坏。它给出了一个错误,例如“我们很抱歉。我们无法打开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我认为它可能与标题有关。我也猜测它可能是客户端问题,因为文件在服务器端创建正常。

提前致谢。 : - )

1 个答案:

答案 0 :(得分:0)

感谢@Musa建议使用' GET'而不是' POST'这完美地运作了。

正如@Musa建议的那样,本例中的客户端javascript应为:

window.location = 'services/doc_search_results_service.php/';

替换了原始问题中引用的所有javascript。

注意 - 如果由于某种原因无法使用GET,我不确定答案是什么。