无法从Ajax查询

时间:2016-02-16 14:55:34

标签: php jquery ajax csv download

我想从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字符串:每次都没问题。

唯一的问题是没有下载窗口,也没有保存data.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 />

1 个答案:

答案 0 :(得分:3)

Javascript(jQuery)绝对可以 NOT 触发文件下载;这将是一个巨大的安全问题。

您必须做的是以下内容:

  1. 调用CSV生成器
  2. 使用唯一名称
  3. 将CSV保存到服务器
  4. 将此唯一名称传递给success:回拨
  5. 使用window.location将浏览器重定向到CSV文件
  6. 如果我的帖子非常简洁,我很抱歉,但我只是不想让你在数小时内追逐你的尾巴试图获得一些基本上被网络浏览器阻止的东西。

    <强>的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';
            }
        });
    }
    

    <强> ouvrage.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;
    
    ?>