无法从 Ajax 查询触发 CSV 文件下载


Impossible to fire CSV file download from Ajax query

我想从 Ajax 查询触发下载窗口。

当我单击页面上的按钮时,将启动 Ajax 查询。

这是 Ajax 查询(单击按钮时调用的函数(:

function exportDetailOuvrage(idData){
    $.ajax({
        url : 'ouvrage.php',
        type : 'POST',
        data : { typeOuvrage : idData },
        success : function (data){
            $('body').append(data);
        }
    });
}

以下是生成 CSV 的 PHP 代码:

<?php
$csv = "Town;Name;Code'r'n" ;
foreach($result as $row){
    $csv .= $row['town'].";".$row['name'].";".$row['code']."'r'n" ;
}
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=data.csv");
echo $csv;
?>

在 PHP 代码中,$result 是基于数据库中的 SQL 查询构建的数组。

CSV 字符串是根据需要生成的,服务器答案是 200(使用 firebug 没有错误(。我已经检查了发送的参数和返回的 CSV 字符串:一切都没问题。

唯一的问题是没有出现下载窗口,也没有保存数据.csv文件...

我想知道我的 Ajax 代码,尤其是success参数的内容是否良好。我不知道在这个参数中到底要放什么。


编辑:

根据@MonkeyZeus回答和评论,以下是我gimme_file.php的内容:

<?php
    session_start();
    header("Content-Type: text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=data.csv");
    readfile($_SESSION['I_CAN_DOWNLOAD_ONLY_THIS']);
    exit;
?>

我在data.csv下载的文件中收到以下错误消息:

<br />
<b>Notice</b>:  Undefined index: I_CAN_DOWNLOAD_ONLY_THIS in <b>D:'STAT'modele'gimme_file.php</b> on line <b>7</b><br />
<br />
<b>Warning</b>:  readfile(): Filename cannot be empty in <b>D:'STAT'modele'gimme_file.php</b> on line <b>7</b><br />

Javascript(jQuery(绝对不能在本地触发文件下载;这将是一个巨大的安全问题。

您必须执行以下操作:

  1. 调用 CSV 生成器
  2. 使用唯一名称将 CSV 保存到服务器
  3. 将此唯一名称传递给success:回调
  4. 使用window.location将浏览器重定向到 CSV 文件

如果我的帖子非常简洁,我深表歉意,但我只是不希望你追逐你的尾巴几个小时,试图实现被网络浏览器从根本上阻止的东西。


jQuery

function exportDetailOuvrage(idData){
    $.ajax({
        url : 'ouvrage.php',
        type : 'POST',
        data : { typeOuvrage : idData },
        success : function (data){
            window.location = 'http://www.mywebsite.com/gimme_file.php';
        }
    });
}

乌夫拉格.php

<?php
session_start();
$csv = "Town;Name;Code'r'n" ;
foreach($result as $row){
    $csv .= $row['town'].";".$row['name'].";".$row['code']."'r'n" ;
}
$filename = 'ouvrage_'.uniqid('', TRUE).'.csv';
file_put_contents($filename, $csv);
$_SESSION['I_CAN_DOWNLOAD_ONLY_THIS'] = $filename;
?>

gimme_file.php

<?php
session_start();
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=data.csv");
readfile($_SESSION['I_CAN_DOWNLOAD_ONLY_THIS']);
exit;
?>