2015-05-06 52 views
2

我想开发一种方式让用户通过jQuery/PHP下载CSV格式的表格。CSV下载与PHP/jQuery

  1. 我的目标是发送jQuery请求到服务器使用PHP。
  2. PHP然后创建CSV内容并将其返回。
  3. jQuery然后强制浏览器将内容下载为CSV文件。

我有90%的工作,最后一点是我需要在用户浏览器中使用jQuery强制CSV下载。

我的PHP脚本

<?php 
class Export { 
    public static function tocsv($results = array(), $fields = array(), $filename) { 
     $fh = fopen('php://output', 'w'); 
     ob_start(); 
     fputcsv($fh, $fields); 

     if(!empty($results)) { 
      foreach($results as $row) { 
       fputcsv($fh, (array) $row); 
      } 
     } 

     $string = ob_get_clean(); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Content-type: text/csv"); 
     header("Content-Disposition: attachment; filename=$filename"); 

     exit($string); 
    } 
} 
?> 

我的jQuery脚本

$(function() { 
    var btnName; 
    $('.button').click(function() { 
      btnName = $(this).attr('name'); 
      btnValue = $(this).attr('value'); 
    }); 

    $("#spendReports").submit(function(event) { 
     event.preventDefault(); 
     var formData = $('#spendReports').serializeArray(); 
     formData.push({ name: btnName, value: btnValue }); 

     $.post('spendReports.php', formData, function(data) 
     { 
      var data = $.parseJSON(data); 
      $.each(data, function(i, val) { 
       var newRow = '<tr><td class="dates-col" data-th="Date">' + data[i]["dates"] + '</td><td data-th="Project name">' + data[i]["project"] + '</td><td data-th="Total budget">' + data[i]["budget"] + '</td><td data-th="Plot numbers">' + data[i]["plots"] + '</td><td data-th="Categories">' + data[i]["categories"] + '</td><td data-th="Day work spent">£' + data[i]["day_work_spent"] + '</td><td data-th="% spend">' + data[i]["day_work_spent_percent"] + '%</td><td data-th="Price work spent">£' + data[i]["price_work_spent"] + '</td><td data-th="% spend">' + data[i]["price_work_spent_percent"] + '%</td><td data-th="Agency work spent">' + data[i]["agency_work_spent"] + '</td><td data-th="% spend">' + data[i]["agency_work_spent_percent"] + '%</td><td data-th="Subcon spent">' + data[i]["subcon_work_spent"] + '</td><td data-th="% spend">' + data[i]["subcon_work_spent_percent"] + '%</td><td data-th="Supervision spent">' + data[i]["supervision_spent"] + '</td><td data-th="% spend">' + data[i]["supervision_work_spent_percent"] + '%</td><td data-th="Total spent">£' + data[i]["total_spent"] + '</td></tr>'; 
       $("#results > tbody").append(newRow); 
      }); 
     }); 
    }); 
}); 

这不同于Download File Using jQuery因为我不是物理服务器上创建一个文件,因此没有一个发送给jQuery的物理链接。

+0

这是不可能使用Ajax,用户需要实际点击的东西。你可以通过创建一个href来模拟它,然后用javascript点击它...或者你可以让用户直接下载文件而不使用任何ajax。 – Augwa

+0

@Barmar这和你发布的链接不一样。我没有物理地在服务器上创建文件。我只是将CSV内容返回给jQuery,然后希望jQuery强制在浏览器中下载文件。 – V4n1ll4

+1

我不认为有一种方法可以让Javascript自行下载。您必须将浏览器重定向到返回下载的URL。 – Barmar

回答