Php 从request.responseText下载Excel文件
在我的应用程序(Yii)中,我有一个ajaxsubmit按钮,它触发Excel文件的生成(使用PHPExcel)。 成功后,我使用隐藏表单提交文件以下载:Php 从request.responseText下载Excel文件,php,jquery,ajax,excel,yii,Php,Jquery,Ajax,Excel,Yii,在我的应用程序(Yii)中,我有一个ajaxsubmit按钮,它触发Excel文件的生成(使用PHPExcel)。 成功后,我使用隐藏表单提交文件以下载: <div class="reporting"> <?php $this->beginWidget('zii.widgets.jui.CJuiDialog',array( 'id'=>'mydialog', 'options'=>arra
<div class="reporting">
<?php
$this->beginWidget('zii.widgets.jui.CJuiDialog',array(
'id'=>'mydialog',
'options'=>array(
'title'=>'Warning!',
'autoOpen'=>false, //true,
'modal'=>'true',
'width'=>'auto',
'height'=>'auto',
'open' => 'js:function(event, ui) {
}',
'close' => 'js:function(event, ui) {
$(".ui-dialog:has(#mydialog)").empty().remove();
}',
)
));
?>
<table class="contentheader">
<tr>
<td>
<?php echo CHtml::DropDownList('dropDownId', $lastyear, $yearslist, array('options'=>array($lastyear=>array('selected'=>true)) )); ?>
</td>
</tr>
</table>
<br />
<?php echo CHtml::ajaxSubmitButton('Form Ajax Submit Button',
CHtml::normalizeUrl(array('/planning/xlsAbsences')),
array(
'type'=>'POST',
'beforeSend' => "function(request) { console.log('beforeSend'); }",
'data'=>'js:$("#select-year-form").serialize()+"&year="+$("#dropDownId :selected").text()',
'success' => function(response, status, request){
$("#mydialog").dialog("close");
var disp = request.getResponseHeader("Content-Disposition");
if (disp && disp.search("attachment") != -1) {
var filename = disp.substring(disp.indexOf("filename=") + 10, disp.length-1);
var form = $("<form method=\"POST\" action=\"index.php?r=planning/dl\">");
form.append($("<input type=\"hidden\" name=\"content\" value=\"" + request.responseText + "\">"));
form.append($("<input type=\"hidden\" name=\"filename\" value=\"" + filename + "\">"));
$("body").append(form);
form.submit();
}
}
'complete' => "function(request) { console.log(request); }",
'error' => "function(data) { alert('erro'+data); }",
),
array('name' => 'run', 'class' => 'btn btn-success')
); ?>
<?php $this->endWidget('zii.widgets.jui.CJuiDialog');
echo CHtml::link(Yii::t('app','app.menu.reporting.planning.xlsabsence'), '#', array(
'onclick'=>'$("#mydialog").dialog("open"); return false;',
));
?>
</div>
给你,这就是你想要实现的目标:
更多信息请参见此处:无需使用ajax调用来完成此操作
如果将数据提交到一个URL,该URL返回设置了内容处置
标题的内容,浏览器将不会打开该页面,但会提示下载
让我们假设这就是你现在拥有的:
$.ajax({
type: 'POST',
url: '/excel/generate.php',
'success' => function(response, status, request){
$("#mydialog").dialog("close");
var disp = request.getResponseHeader("Content-Disposition");
if (disp && disp.search("attachment") != -1) {
var filename = disp.substring(disp.indexOf("filename=") + 10, disp.length-1);
var form = $("<form method=\"POST\" action=\"index.php?r=planning/dl\">");
form.append($("<input type=\"hidden\" name=\"content\" value=\"" + request.responseText + "\">"));
form.append($("<input type=\"hidden\" name=\"filename\" value=\"" + filename + "\">"));
$("body").append(form);
form.submit();
}
}
});
$.ajax({
键入:“POST”,
url:“/excel/generate.php”,
“成功”=>功能(响应、状态、请求){
$(#mydialog”).dialog(“关闭”);
var disp=request.getResponseHeader(“内容处置”);
如果(显示和显示搜索(“附件”)!=-1){
var filename=disp.substring(disp.indexOf(“filename=”)+10,disp.length-1);
变量形式=$(“”);
表格.附加($(“”);
表格.附加($(“”);
$(“正文”)。附加(表格);
表单提交();
}
}
});
你可以用它来代替它
var form = $('<form/>', {method: 'POST', action: '/excel/generate.php'});
form.appendTo('body');
form.submit();
var form=$(“”,{method:'POST',action:'/excel/generate.php'});
形式。附于(“主体”);
表单提交();
您是否真的将检索到的Excel提交回服务器以强制下载?这似乎是一个巨大的开销。只需返回下载URL(设置内容处置头等)从Ajax调用并执行JavaScript重定向到此URL。我编辑我的帖子是为了让事情更清楚-你确定这可以更容易地完成吗?我编辑我的帖子是为了让事情更清楚-我认为要使用此插件,文件必须存在-这不是我的情况…你已经在服务器上生成了文件,你只是没有保存它,但这并不意味着它不存在。它确实存在,因为是您生成的。当然,你可以使用这个插件,因为它完全符合你的要求。我想如果我尝试这个方法,我就无法自动关闭对话框:(只需在表单.submit()之前关闭对话框;
我无法理解它:正如我说的,我正在用PHP编写代码(Yii)你的代码是javascript——我编辑了我的文章,给出了完整的查看操作代码——那么你能告诉我我必须用什么来替换什么吗?生成Excel文件发生在服务器端,所以只有发布到服务器(使用javascript)并返回带有下载头的Excel文件就足够了。