PHP文件下载只是吐出缓冲区而不是实际文件

时间:2017-04-05 15:48:55

标签: javascript php jquery ajax wordpress

首先,我知道这不是强制文件下载的最佳方式,它很糟糕而且很可怕,但是嘿,我只是被告知要做什么!

所以我安装了WP,我正试图利用WP AJAX来下载文件。

我的表单在functions.php中遇到一个AJAX回调,在做了n个部分后,我正在使用这个函数:

function download_file()
{
    $file = get_template_directory()."/a_pdf_file.pdf";

    if(file_exists($file)) {

        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($file).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }
    else
    {
        die('The provided file path is not valid.');
    }
}

问题是,缓冲区只是在AJAX响应中吐出。没有下载文件。

我是否需要在AJAX端做一些事情,在成功回调中可能?

我尝试的其他选项似乎也失败了。

  • header('Location: $file_url');不起作用
  • 尝试了所有方式的标题选项,仍然没有区别
  • AJAX回调中的
  • window.open(url, '_blank')作为弹出窗口被阻止
  • window.location()在同一窗口中打开,不接受

1 个答案:

答案 0 :(得分:0)

Ajax无法直接下载文件,而是需要在其自己的框架中打开它。如果你使用jquery,你可以像这样动态创建自己的隐形iframe。这是来自我的代码,但是在这里摆脱jquery不应该那么难。

function downloadUrl(url) {
    var iframe = document.createElement("iframe");
    iframe.src = url;
    $(iframe).hide();
    document.body.appendChild(iframe);
    $(iframe).load(function() {
        //Show error, if call returned an error instead of a file
        var cont = $(iframe).contents().find("body");
        if (cont.text().length != 0)
            alert(cont.text()); 
    });
}