我使用jquery将get查询设置为php脚本,然后该脚本查询数据库并写入屏幕,但我无法使用它来触发下载,即使使用标头也是如此。
步骤如下:
-
创建一个链接,用户点击该链接下载数据
-
javascript将查询参数发送到php
-
php查询数据库并写入文件
-
客户端下载文件
但我无法实现第四步。
步骤1:(这是一个表对象,也包含参数:
d3.select("#some-div").append('a")
.attr("href", "javascript: void(0)")
.on("click", function() { this.saveAsCSV() };
步骤2:Javascript文件进行查询:
var saveAsCSV = function(params) {
var tmp_params = $.extend({}, params);
tmp_params['State'] = "NM";
$.get('php/get_data.php', tmp_params);
}
php返回查询:
...
header("Content-type: application/text-csv");
header("Content-Disposition: attachment; filename=query_result.csv");
while($row = $result->fetchArray() {
print "$row";
}
...
它的工作原理很好,因为它可以正确地查询并打印javascript函数中的数据(因此,如果我将其添加到get return函数中,它会将其打印到console.log),但我不知道应该采取什么不同的做法,让它直接下载。
我尝试过的一件事是对params对象执行以下操作:
var param_string = encodeURIComponent(JSON.stringify(params));
location.href = 'http://www.mysite.com"+param_string;
但这既会让用户离开页面,又无法下载数据。
编辑:我应该澄清一下,php文件确实以csv格式很好地输出了查询。问题似乎是,无论php头是什么,使用$.get()函数都不会触发下载。也许我只需要提供一个带有URL地址中参数的简单链接,但我不确定如何将javascript对象转换为URL格式,以便php脚本可以对其进行解释。
您可以使用URL php/get_data.php?State=NM
(可能是其他参数)打开一个弹出窗口/新窗口/选项卡/任何内容。它应该下载输出。
但是您的输出可能是错误的,因为您只是打印变量$row
,它是一个数组。如果您尝试以这种方式打印数组,它只会显示Array
。
您需要正确地输出行。不幸的是,我不太了解CSV结构,无法帮助您解决这个问题。
您可以使用类似jQuery的东西对此进行AJAX调用,它会弹出下载框,同时让用户留在页面上。这样做:
$.ajax({data: {download: 'query_result.csv'}, type: 'GET', url: 'download.php', cache: false });
我为以前的雇主试过几次,效果总是很好。尽管我主要使用.zip和.docx文件。
我想通了!
基本上,我的编码是错误的。我不想用编码
encodeURIComponent(JSON.stringify(params));
php脚本无法读取结果。然而,只使用$.param().是可行的
总之,下载是通过创建URL链接,然后使用location.href链接来触发的。因此,其他一切都是一样的,但不是步骤2中的$.get(),而是:
var url_params = $.param(tmp_params);
location.href = url_params;
它生成下载。谢谢