从php发送一个csv文件到浏览器

时间:2015-12-05 03:59:11

标签: javascript php ajax

我已经看过很多的消息来源,但我还是无法让它发挥作用。我想点击html中的一个链接,让它得到一个文本文件(碰巧是csv)。

        <button type="button" id="csvButton"  class="genericButton"><a id="csvAnchor">Create CSV File</a></button><br/>

然后在javascript:

function getCSVText(evt)  {

  if (currentChecklistCountry)  {

    $.post('../php/sendCSV.php',
    {
      country   :  currentChecklistCountry,
    },
    function (data, textStatus, jqXHR){
      // console.log("PHP : sendCSV.php");
      // console.log("sendCSV.php, data = " + data);
    }
   )
  .fail(function() { console.log("error in sendCSV.php"); })
  .always(function() { console.log("sendCSV.php finished"); });

  // var a = document.getElementById("csvAnchor");

  // download attribute only currently (12/4/2015) works in Chrome and Edge
  // a.href = "Countries/" + currentChecklistCountry + "CSV.txt";
  // a.download =  currentChecklistCountry + "CSV.txt";

  // a.target  =  "_blank";
  // a.href    =  "../php/sendCSV.php?country=" + currentChecklistCountry + "";
  }
  else  checklistCountryButton.classList.add("needsAttention");
  }
}

因为a.download或a.href方法仅在Edge和Chrome中有效,我试图用php执行此操作。

和php:

<?php
// set_time_limit(0);
// ignore_user_abort(false);
// ini_set('output_buffering', 0);
// ini_set('zlib.output_compression', 0)

ini_set('display_errors', '1');
error_reporting(E_ALL | E_STRICT);

$country = $_POST['country'];

// echo "country = " . $country;
if (!isset($country)) { echo "failure"; exit;  }
// echo "after isset";
$fileName  = '../Countries/' . $country . 'CSV.txt';

// echo "fileName = " . $fileName;

if(file_exists($fileName)) {

    // header("Content-Type: text/plain");
    header("Content-type: application/octet-stream");
    // header("Content-Disposition: attachment; filename=" . $country . "CSV.txt");
    header("Content-disposition: attachment;filename="'. basename($fileName).'"' );
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($fileName));
    ob_clean();
    flush();
    readfile($fileName);
    exit;
}
else {
    echo "file does not exist : " . $country;
}
?>

它只是无声地失败,服务器或控制台上没有错误消息。数据在ajax函数中返回,但不是以文件下载的形式。

谢谢。

[编辑] Vir是正确的。通过js文件中的这种修改,它可以工作:

  var form = $('<form method="post" action="../php/sendCSV.php?country=' + currentChecklistCountry + '"></form>');
  $('body').append (form);
  form.submit ();
  form.remove ();

非常感谢。

1 个答案:

答案 0 :(得分:1)

Ajax不支持下载(触发保存对话框)。您可以做的最好的事情是创建临时表单DOMElement,将其附加到文档的正文,触发它的提交方法,最后从DOM树中删除它。像这样:

var form = $('<form method="post" action="../php/sendCSV.php"></form>');
$('body').append (form);
form.submit ();
form.remove ();