PHP无法从ajax调用中输出CSV

3
我有一个按钮,点击后应该将变量提交给ajax调用,然后创建并下载csv文件,但出于某种原因,文件无法下载。但是我在Chrome Dev工具中获得了正确的输出:
这是我的代码:

index.php

<form class="navbar-form navbar-left" method="post">
<input hidden id="ajaxquery" value="<?php echo $ajaxquery;?>">
<button type="button" class="btn btn-success btn-lg" id="downloadcsv">Download CSV</button>
</form>

script.js

$(document).ready(function() {
var csvquery = function(){
    function getUrlParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++) 
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam) 
        {
            return sParameterName[1];
        }
    }
}     
    ajaxquery = $('#ajaxquery').val();
    department = getUrlParameter('department');
    startdate = getUrlParameter('startdate');
    enddate = getUrlParameter('enddate');
    staffsearch = getUrlParameter('staffsearch');
                $.ajax({
                    type: 'POST', // type
                    url: '../report/csv.php', // request file the 'check_email.php'
                    data: {ajaxquery:ajaxquery, department: department, startdate:startdate, enddate: enddate, staffsearch: staffsearch},
                    success: function(responseText) {

    }
                    }); // end success
            }
$('#downloadcsv').click(csvquery);
});

csv.php

session_start();
require '../connect.php';
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
$output = fopen('php://output', 'w');

fputcsv($output, array('Name', 'Department','Hours Worked', 'On Holiday', 'Ill' , 'Date'));

$sql = "SELECT time.id as timeid, time.staff_id, time.timein, time.onholiday, time.dateadded, time.ill, time.notes, staff.id AS staffid, department.id AS departmentid, department.department_name, staff.staff_name, staff.department_id FROM time, staff, department WHERE staff.id = time.staff_id AND staff.department_id = department.id ORDER BY `time`.`dateadded` ASC ;";

$rows = mysqli_query($connect, $sql);
while ($rowcsv = mysqli_fetch_assoc($rows)){ 
    fputcsv($output, array($rowcsv['staff_name'],$rowcsv['department_name'],$rowcsv['timein'],$rowcsv['onholiday'],$rowcsv['ill'],$rowcsv['dateadded']));
};
readfile("php://output");

你有检查过ajax调用返回的控制台日志中是否有任何数据吗? - Danny Broadbent
当我点击csv.php时,在Dev工具响应窗口中返回输出。 (@danny-broadbent,你和我兄弟同名 :D) - Anthony Broadbent
1
姓名, 部门, 工作小时数, 假期中, 病假, 日期 员工3, 财务部, 7, 是, , 2015-06-16 "乔·布洛格斯", 审计部, 7, 是, 是, 2015-06-17 "乔·布洛格斯", 审计部, 7, 是, 是, 2015-06-18 "乔·布洛格斯", 审计部, 4, 是, , 2015-06-19 "乔·布洛格斯", 审计部, 6, , , 2015-06-20 "乔·布洛格斯", 审计部, 6, 是, , 2015-06-21 "乔·布洛格斯", 审计部, 8, , 是, 2015-06-23 "约翰·史密斯", "市场和定价部", 7, 是, , 2015-06-23 姓名, 审计部, 3, , , 2015-06-23 "乔·布洛格斯", 审计部, 7, , , 2015-06-24 "乔·布洛格斯", 审计部, 7, , , 2015-06-29 "约翰·史密斯", "市场和定价部", 8, , , 2015-06-29 员工3, 财务部, 9, , , 2015-06-29 姓名, 审计部, 9.6, , , 2015-06-29 - Anthony Broadbent
2
与其使用$.aJax,我建议您使用$.fileDownload(); - Danny Broadbent
https://github.com/johnculviner/jquery.fileDownload/blob/master/src/Scripts/jquery.fileDownload.js - Danny Broadbent
哈哈,这个名字真有意思,我的一个表亲叫安东尼 :) - Danny Broadbent
1个回答

5

将Ajax更改为fileDownload:

$.fileDownload('../report/csv.php', {
    httpMethod: 'POST',
    data: {
        ajaxquery:ajaxquery, department: department, startdate:startdate, enddate: enddate, staffsearch: staffsearch
    },
    successCallback: function (url) {
        //insert success code

    },
    failCallback: function (html, url) {
        //insert fail code
    }
});

您可以通过这个js文件使用jQuery的fileDownload方法: https://github.com/johnculviner/jquery.fileDownload/blob/master/src/Scripts/jquery.fileDownload.js 更多信息请参考: http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/

1
哇,这个完美地运行了。我不想使用插件,因为CSV下载相当简单,但是这个不一样。我欠你一杯啤酒:D。我没有足够的声望来点赞:( - Anthony Broadbent
1
没问题,很高兴能帮到你! :) 今天我已经用完了投票次数,所以要等到明天才能给你点赞。 - Danny Broadbent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接