【问题标题】:PHP headers are not working in WordPress ajax callPHP 标头在 WordPress ajax 调用中不起作用
【发布时间】:2018-07-27 07:02:35
【问题描述】:

我有一个生成和下载 CSV 文件的 PHP 脚本。以下是该脚本的代码:

<?php

$cars = array(
  array("Volvo",22,1888),
  array("BMW",15,13),
  array("Saab",5,2),
  array("Land Rover",17,15)
  );

// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=csvfile.csv');

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

// output the column headings
fputcsv($output, array('Car', 'Year', 'Miles' ));

//Loop through the array and add to the csv
foreach ($cars as $row) {
    fputcsv($output, $row);
}
exit;
?>

当我直接访问这个脚本时,它可以正常工作,但我的目标是在 WordPress AJAX 调用中使用这个脚本,我使用 WordPress AJAX API 创建了 AJAX,如下所示:

add_action( 'wp_ajax_export_timeline', 'export_timeline' );

然后在回调函数export_timeline 中编写相同的 PHP 代码(上面粘贴的),但不是生成 CSV 并针对 AJAX 调用下载,而是返回打印的数组作为响应。调用AJAX没有错误,我已经测试了回显其他字符串,它的响应很好。

但是在上面提到的脚本的情况下,我认为 PHP 标头在回调函数中不起作用,因为它不是生成和下载 CSV,而是回显数组作为响应。任何帮助都会得到帮助。

【问题讨论】:

  • 还在代码末尾添加exit;die;
  • @Sudharshan Nair,已经完成了。但不工作。

标签: php jquery ajax wordpress


【解决方案1】:

据我所知,PHP 标头不适用于 AJAX 调用:

您可以做的是在您的 php 代码中创建 csv 数据并将其作为对回调的响应。

您的 php 代码必须返回一个 json 作为 echo json_encode(['data' =&gt; $data, 'status' =&gt; 'success' ]); $data 变量必须具有有效的 CSV 格式数据。

在您的 javascript 中,您可以使用以下内容进行 CSV 下载:

function download_csv(){
    var make_download = (function () {
            var $a = $('<a>', {
              'class': 'csv-downloader',
              'style': 'display: none'
            });
            $('body').find('.csv-downloader').remove();
            $('body').append($a);
            return function (data, fileName) {
                const blob = new Blob([data], {type: "octet/stream"}),
                    url = window.URL.createObjectURL(blob);
                $a[0].href = url;
                $a[0].download = fileName;
                $a[0].click();
                window.URL.revokeObjectURL(url);
            };
        }());
    $.when($.ajax({
      dataType: 'json',
      method: 'POST',
      url: URL, // url here
    })).then((response) => {
      if (response.status == 'success') {
        make_download(response.data, `my-file.csv`);
      }      
    })
  }

【讨论】:

  • 在尝试这个JS之前,我想告诉你,发送AJAX请求的js函数写在js文件中并包含在页面中,发送AJAX函数的JS函数没有写在表单所在的同一页面。这个脚本会以这种方式工作吗??
  • 如果您向您发送更正 URL 的请求并按照步骤操作。这段代码肯定会像我在一些项目中使用的这段代码一样工作。
【解决方案2】:

尝试直接调用url,不用ajax调用,应该可以的。

【讨论】:

  • 我必须通过管理页面的表单传递帖子 ID,因此 CSV 会根据该 ID 获取数据并将其下载。正如我提到的,这个脚本在直接访问时工作正常,但是我的客户的要求是不要在脚本将运行的空白页面上提交表单,他需要用 AJAX 来完成,我已经通过访问这个脚本提供了解决方案直接,但那是不合适和必需的。
  • 您不能通过 ajax 调用修改标头。如果您提交表单,您应该创建数据并设置标题。它不会显示空白页面,只会打开一个下载窗口。
【解决方案3】:

尝试修改标题如下

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=csvfile.csv" );
    header("Content-Transfer-Encoding: binary"); 

【讨论】:

  • 我试过这些标题,但没有用。结果相同,它不是生成和下载 CSV,而是返回打印的数组作为响应。
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多