php ajax请求下载文件 - 使用“AJAX”下载CSV文件



ajax文件流下载 ajax导出excel (6)

我正在尝试为我的网站完成一个相当简单的任务,但我不确定如何去做。我希望用户查看一个表,然后单击一个按钮,此时用户可以保存该表的内容为csv文件。此请求有时可能非常复杂,因此我生成一个进度页面以提醒用户。

除了实际生成csv文件之外,我发现了大多数事情。 (我使用jQuery和PHP)

点击运行jQuery代码:

hmis_query_csv_export: function(query_name) {
    $.uiLock('<p>Query Loading.</p><img src="/images/loading.gif" />')
    $.get({
        url: '/php_scripts/utils/csv_export.php',
        data: {query_name: query_name},
        success: function(data) {
            $.uiUnlock();
        }
    });}

相关的PHP:

header("Content-type: text/x-csv");
header("Content-Disposition: attachment; filename=search_results.csv");
//
//Generate csv
//
echo $csvOutput
exit();

这样做是将文本作为PHP文件发送,但它不会生成下载。 我究竟做错了什么?


Answers

完成此任务的最佳方法是使用数据URI,如下所示:

  1. 按正常方式对服务器进行AJAX调用
  2. 在服务器端生成CSV
  3. 返回数据(裸露或JSON结构内部)
  4. 使用返回的数据在Javascript中创建数据URI
  5. 将window.location.href设置为Data URI

请参阅此链接以获取相关说明(特别是第3段): http://en.wikipedia.org/wiki/Data_URI_schemehttp://en.wikipedia.org/wiki/Data_URI_scheme

这样,您不需要在服务器上保存任何文件,也不需要使用iframe或隐藏的表单元素或任何此类黑客。


为了回应和扩展其他人所说的内容,你无法使用AJAX真正发送文件。 其中一个原因是(并且有人纠正我,如果我错了,请)您当前所在的页面已经发送了其内容标题; 你不能再将它们发送到同一个窗口,即使有一个AJAX请求(这是你的PHP文件试图做的)。

我之前在项目中所做的是简单地将链接(带有target =“_ blank”或javascript重定向)提供给单独的下载PHP页面。 如果您正在使用Apache,请查看mod_xsendfile。


如果您强制下载,可以将当前页面重定向到下载链接。 由于链接将生成下载对话框,因此当前页面(及其状态)将保留在原位。

基本方法:

$('a#query_name').click(function(){
    $('#wait-animation').show();
    document.location.href = '/php_scripts/utils/csv_export.php?query_name='+query_name;
    $('#wait-animation').hide();
});

更复杂:

$('a#query_name').click(function(){
    MyTimestamp = new Date().getTime(); // Meant to be global var
    $('#wait-animation').show();
    $.get('/php_scripts/utils/csv_export.php','timestamp='+MyTimestamp+'&query_name='query_name,function(){
        document.location.href = '/php_scripts/utils/csv_export.php?timestamp='+MyTimestamp+'&query_name='+query_name;
        $('#wait-animation').hide();
    });
});

在PHP脚本:

@header("Last-Modified: " . @gmdate("D, d M Y H:i:s",$_GET['timestamp']) . " GMT");
@header("Content-type: text/x-csv");
// If the file is NOT requested via AJAX, force-download
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
    header("Content-Disposition: attachment; filename=search_results.csv");
}
//
//Generate csv
//
echo $csvOutput
exit();

两个请求的URL必须相同才能欺骗浏览器不要在document.location.href开始新的下载,而是将副本保存在缓存中。 我不是很确定,但看起来很有希望。


那么使用AJAX的目的是避免页面的可见重载。 如果您想要下载,则需要相反的 - 来自浏览器的全新请求。 我会说,只需创建一个指向您的php页面的简单按钮。


我不认为您可以使用AJAX / JS请求进行浏览器下载。 尝试使用隐藏的iframe导航到生成CSV的页面


尝试

    $(document).ready(function () {
        if ($("#site").length > 0) {
            window.location = "<%= Url.Content("~") %>" + "Login/LogOn";
        }
    });

把它放在登录页面上。 如果它被加载到主页面上的div上,它将重定向到登录页面。 “#site”是位于除登录页面以外的所有页面上的div的ID。





php ajax csv