0

我试图弄清楚这是怎么可能的。

我希望用户能够点击一个链接,它会下载某个文件。该文件将在 Ajax 调用中确定(现在我只有一个硬编码值)。

这是我的情况:当调用 Ajax 时,为请求提供的链接是我的框架的一部分,它有一个前端控制器,并且 url 被重定向。因此,我不能只将链接发送到一个名为 download.php 的文件,而其中只有标头代码。它贯穿整个框架流程,最终到达处理 Ajax 调用的方法。

这是我的代码:

$('.jobApplicationDownload').click(function() {
var that = $(this);
$
.ajax({
    type : "POST",
    url : "myfw/businessHome/applications/downloadJobApplicationItem",
    data : {
        "ajaxFileType" : that.attr("data-ftype"), "ajaxApplicationId" : that.attr("data-did")
    },
    success : function(html) {
        alert(html);
    },
    error : function(XMLHttpRequest,
            textStatus, errorThrown) {
        alert("ERROR");
    }
});

});

这是PHP。请记住,这是在通过 Front Controller 和一堆其他方法之后。这绝不是 Ajax 调用之后的第一站。

function downloadJobApplicationItem() {
    //download.php
    //content type
    $fileName = "/myfw/common/jobs/resumes/eZACKe_1359081853_Week Three Sprints & Hurdles Workout 24th - 28th of Sept (1).pdf";
    header('Content-disposition: attachment; filename='.$fileName);
    header('Content-type: application/pdf');
    //read from server and write to buffer
    readfile('/myfw/common/jobs/resumes/eZACKe_1359081853_Week Three Sprints & Hurdles Workout 24th - 28th of Sept (1).pdf');
    echo $_POST['ajaxFileType']. " ". $_POST['ajaxApplicationId'];
}

编辑:哦,顺便说一句,结果是我正在回显的东西被警告,并且没有文件下载开始。

4

2 回答 2

2

我通过缓冲所有输出并允许控制器更改或取消设置重定向位置来解决这个问题。在所有控制器运行后,检查重定向位置并在那时写入重定向标头(如果需要)。然后输出你的缓冲区。

像这样的东西:

$appSettings = new AppSettings();
$appSettings->setRedirect(...);
$controller=new Controller($appSettings);
ob_start();
$controller->run(); //Your controller can call $appSettings->setRedirect(false);
$redirect=$appSettings->getRedirect();
if($redirect===false)
{
    ob_end_flush(); //Send the buffer
}
else
{
    ob_end_clean(); //Discard the buffer
    header('Location: '.$redirect);
}
于 2013-01-25T03:41:00.723 回答
2

阅读您的问题时我很困惑,因为我认为您在多个问题之间混淆了。

  1. AJAX 请求是否到达正确的处理程序?: 在你的框架中使用的 URL 路由机制和几乎所有其他机制只在这里很重要,它不影响你是否可以访问你的物理文件。这是完全不同的事情。无论如何,我会说您的 AJAX 调用是正确的,因为回显会收到警报

  2. 如何通过被重定向的 AJAX 调用发送文件的路径?:您可以考虑使用的一个技巧,与您所做的类似,是使用中央下载功能作为 AJAX 处理程序,并使用通过 AJAX 发送的参数构造文件的路径。

  3. 为什么 readfile 不将所需的文件输出到缓冲区:很可能是您的路径不正确或与服务器设置不兼容。如果您可以在此处发布您的服务器配置,将会有所帮助。

并且发布您的框架的名称也不会受到伤害:)

于 2013-01-25T03:49:02.193 回答