1

我使用 jquery 将 get 查询设置为 php 脚本,该脚本然后查询数据库并写入屏幕,但我无法让它触发下载,即使使用标题也是如此。

步骤如下:

  1. 创建用户单击以下载数据的链接

  2. javascript将查询参数发送到php

  3. php查询数据库并写入文件

  4. 客户端下载文件

但我无法让第 4 步发生。

第 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 格式输出查询。问题似乎是使用 $.get() 函数不会触发下载,无论 php 标头如何。也许我只需要提供一个带有 URL 地址中参数的简单链接,但我不确定如何将 javascript 对象转换为 URL 格式,以便 php 脚本可以解释它。

4

3 回答 3

2

php/get_data.php?State=NM您可以使用您的 URL (可能是附加参数)打开一个弹出窗口/新窗口/选项卡/任何内容。它应该下载输出。

但是您的输出可能是错误的,因为您只是打印了$row一个数组变量。如果您尝试以这种方式打印数组,它将仅显示Array.

您将需要正确输出您的行。不幸的是,我不太了解 CSV 结构,无法帮助您解决这个问题。

于 2013-07-02T23:22:45.433 回答
0

我想到了!

基本上,我的编码是错误的。我不想用

encodeURIComponent(JSON.stringify(params));

php 脚本无法读取结果。但是,只使用 $.param() 就可以了。

总而言之,下载是通过创建 URL 链接然后使用 location.href 链接到它来触发的。因此,其他一切都是一样的,但不是第 2 步中的 $.get() ,而是我这样做:

var url_params = $.param(tmp_params);
location.href = url_params;

生成下载。谢谢!

于 2013-07-02T23:36:48.250 回答
0

您可以使用 jQuery 之类的东西对此进行 AJAX 调用,它会弹出下载框,同时保持用户在页面上。做这样的事情:

$.ajax({data: {download: 'query_result.csv'}, type: 'GET', url: 'download.php', cache: false });

我已经为以前的雇主尝试过几次,它总是很有效。虽然我主要是用 .zip 和 .docx 文件来做的。

于 2013-07-02T23:28:58.367 回答