繁体   English   中英

无法触发从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字符串:一切正常。

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

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

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;

?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM