-1

我正在使用 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 我认为这可能与标题有关。我也猜测这很可能是客户端问题,因为文件在服务器端创建正常。

提前致谢。:-)

4

1 回答 1

0

感谢@Musa 提出使用“GET”而不是“POST”的建议,效果很好。

正如@Musa 建议的那样,此示例中的客户端javascript 应该是:

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

它取代了我原来的问题中引用的所有 javascript。

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

于 2015-01-18T13:52:23.190 回答