Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从request.responseText下载Excel文件_Php_Jquery_Ajax_Excel_Yii - Fatal编程技术网

Php 从request.responseText下载Excel文件

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

在我的应用程序(Yii)中,我有一个ajaxsubmit按钮,它触发Excel文件的生成(使用PHPExcel)。 成功后,我使用隐藏表单提交文件以下载:

<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文件就足够了。