我正试图弄清楚这是不可能的。
我希望用户能够点击链接,然后下载某个文件。该文件将在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'];
}
编辑:哦,顺便说一下,结果就是我正在回应被警告的内容,并且没有文件下载开始。
答案 0 :(得分: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);
}
答案 1 :(得分:2)
我在阅读你的问题时感到困惑,因为我觉得你在多个问题之间混淆了。
AJAX请求是否能够到达正确的处理程序?:您的框架中使用的URL路由机制几乎每个都只在这里很重要,并且它不会影响您是否可以到达您的物理文件。这是一个完全不同的问题。无论如何,我说你的AJAX呼叫是正确的,因为回声会被警告
如何通过重定向的AJAX调用将路径发送到文件?:您可以考虑使用的一个技巧,类似于您所做的,是中央下载作为AJAX处理程序运行并使用AJAX发送的参数构造文件的路径。
为什么readfile不会将所需文件输出到缓冲区:它很可能是您的路径不正确或与服务器设置不兼容。如果您可以在此处发布服务器配置,则会有所帮助。
发布框架的名称也不会造成伤害:)