[英]PHP File Download From Ajax with a URL Redirect
我试图弄清楚这是怎么可能的。
我希望用户能够单击链接,并且它将下载某个文件。 该文件将在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。 请记住,这是通过前端控制器和其他方法进行的。 这绝不是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'];
}
编辑:哦,顺便说一句,这的结果是我正在回显被警告的内容,并且没有开始下载文件。
我已通过缓冲所有输出并允许控制器更改或取消设置重定向位置来解决此问题。 在所有控制器运行之后,检查重定向位置并在那时写入重定向头(如果需要)。 然后输出您的缓冲区。
像这样:
$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);
}
在阅读您的问题时我很困惑,因为我认为您在多个问题之间混为一谈。
AJAX请求是否到达正确的处理程序? :框架和几乎所有其他框架中使用的URL路由机制仅在这里很重要,并且不会影响您是否可以访问物理文件。 这是完全不同的事情。 无论如何,我会说您的AJAX呼叫是正确的,因为回声会得到提醒
如何通过重定向的AJAX调用将路径发送到文件? :您可以考虑使用的一种技巧(与您的做法类似)是具有中央下载功能作为AJAX处理程序,并使用随AJAX发送的参数构造文件的路径。
为什么readfile不将所需的文件输出到缓冲区 :您的路径很可能不正确或与服务器设置不兼容。 如果您可以在此处发布服务器配置,将会有所帮助。
并且发布您的框架的名称也不会造成任何伤害:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.