我已经看过很多的消息来源,但我还是无法让它发挥作用。我想点击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 ();
非常感谢。
答案 0 :(得分:1)
Ajax不支持下载(触发保存对话框)。您可以做的最好的事情是创建临时表单DOMElement,将其附加到文档的正文,触发它的提交方法,最后从DOM树中删除它。像这样:
var form = $('<form method="post" action="../php/sendCSV.php"></form>');
$('body').append (form);
form.submit ();
form.remove ();