当使用PHPExcel作为Wordpress插件的一部分生成时,边缘浏览器文件下载不起作用

当使用PHPExcel作为Wordpress插件的一部分生成时,边缘浏览器文件下载不起作用,php,wordpress,phpexcel,Php,Wordpress,Phpexcel,我有以下情况: Wordpress插件(快捷代码)显示带有“提交”按钮的表单。按下“提交”按钮时,将生成一个Excel 2007文件(.xlsx),并通过HTTP头发送到浏览器进行下载。 这在Chrome和Firefox中非常有效,但当我使用Microsoft Edge浏览器(v.40.15063.0.0)或Internet Explorer(v.11.540)尝试此功能时,下载不会触发,而是直接重定向到 http://example.com/wp-admin/admin-ajax.php 然

我有以下情况:

Wordpress插件(快捷代码)显示带有“提交”按钮的表单。按下“提交”按钮时,将生成一个Excel 2007文件(.xlsx),并通过HTTP头发送到浏览器进行下载。 这在Chrome和Firefox中非常有效,但当我使用Microsoft Edge浏览器(v.40.15063.0.0)或Internet Explorer(v.11.540)尝试此功能时,下载不会触发,而是直接重定向到

http://example.com/wp-admin/admin-ajax.php
然后停下来

我怀疑这与插件(php)发送的标题有关。当我从更改内容类型标题时

Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

它开始文件下载,但是文件是空的(并且文件名错误),因为我生成的文件是Excel 2007,但后一种内容类型是旧版本的Excel文件(我不想生成)。我还尝试了添加两种内容类型;字符集=utf-8,结果相同

摘自我的主插件文件:

add_action( 'wp_ajax_myplugin_generate_report', 'handle_report_request' );
add_action( 'wp_ajax_nopriv_myplugin_generate_report', 'handle_report_request' );

function handle_report_request() {

    // Check the nonce
    if ( empty($_POST) || !wp_verify_nonce($_POST['abcd'],'myplugin_generate_report') ) {
        exit; 
    }

    try {
        $date = new DateTime("now");
        $output_filename = "Report_Prefix" . $date->format("Ymd");
        $writeExcel($output_filename);
    } catch (Exception $ex) {
        echo "Error generating report: " . $ex->getMessage();
    } finally {
        wp_die();
    }
}

function writeExcel($outputFilename) {
  $excelObj = new PHPExcel();

  [... populating PHPExcel object ...]

  // Redirect output to a client’s web browser (Excel2007)
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', true, 200);
  header('Content-Disposition: attachment;filename="' . $outputFilename . '.xlsx"');
  // header("Content-Type: application/vnd.ms-excel; charset=utf-8");
  header('Cache-Control: max-age=0');
  header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
  header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 
  header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  header ('Pragma: public'); // HTTP/1.0

  $objWriter = PHPExcel_IOFactory::createWriter($excelObj, 'Excel2007');
  $objWriter->save('php://output');
}
包含表单元素的HTML/PHP代码:

<form action="<?php echo admin_url('admin-ajax.php'); ?>" method="post">
    <?php wp_nonce_field('myplugin_generate_report','abcd'); ?>
    <input name="action" value="myplugin_generate_report" type="hidden">
    <input type="submit" value="Generate report">
</form>

“它启动文件下载,但文件为空(且文件名错误),因为我生成的文件是Excel 2007,但后者的内容类型适用于较旧的Excel文件版本”-只要您保存该文件(而不是试图直接打开它),这一点应该无关紧要——文件系统不关心“内容类型”。。。而且它也不应该使文件为“空”-内容类型标题对脚本实际返回的正文数据没有影响。如果您不需要使用“另存为…”中的正确应用程序打开此功能,但仅将文件保存到磁盘就足够了,那么我会尝试使用“通用”选项内容类型,例如
应用程序/octet流
。()@CBroe我刚刚尝试了“应用程序/八位字节流”——这导致了相同的非下载和重定向问题。对于您之前的评论:我没有保存文件,我需要直接打开文件(即在浏览器中生成文件下载)。我知道内容类型对保存文件并不重要,我需要Edge能够下载此文件。我想,当我将其设置为vnd.ms-excel,但将$objWriter设置为Excel2007时,浏览器收到了一个要下载的流,但无法将其与指定的内容类型匹配,因此出现了“空”文件。首先,为什么要将此表单发送到
/wp admin/admin ajax.php
?您是否使用AJAX提交此表单?您不能直接从后台请求触发下载对话框。向该端点发送非AJAX请求也没有多大意义。@CBroe据我所知,
/wp admin/admin AJAX.php/
是接收表单提交的主要Wordpress URL之一,它们不必通过AJAX工作。同样,这段代码在任何其他浏览器(包括Android浏览器)中都能完美工作,只是在Edge或IE中没有。我只是更改了逻辑,使用
/wp admin/admin post.php
url,得到了相同的行为,这次重定向到
http://example.com/wp-admin/admin-post.php
。“它开始文件下载,但是文件是空的(并且文件名错误),因为我生成的文件是Excel 2007,但后一种内容类型适用于较旧的Excel文件版本”-只要您保存该文件(而不是试图直接打开它),这一点无关紧要-文件系统不关心“内容类型”…也不应使文件“为空”-内容类型标头对脚本实际返回的正文数据没有影响。如果您不需要从“另存为…”,但仅将文件保存到磁盘就足够了,然后我会尝试使用“通用”内容类型,例如
application/octet-stream
。()@CBroe我刚刚尝试了“应用程序/八位字节流”-这会导致相同的非下载和重定向问题。对于您之前的评论:我没有保存文件,我需要直接打开文件(即在浏览器中生成文件下载)。我知道内容类型对保存文件不重要,我需要Edge能够下载此文件。我认为当我将其设置为vnd.ms-excel,但将$objWriter设置为Excel2007时,浏览器收到要下载的流,但无法将其与指定的内容类型匹配,因此为“空”文件。首先,为什么要将此表单发送到
/wp admin/admin ajax.php
?是否使用ajax提交此表单?您不能直接从后台请求触发下载对话框。并且将非ajax请求发送到此端点也没有多大意义。@CBroe据我所知,
/wp admin/admin-ajax.php/
是接收表单提交的主要Wordpress URL之一,它们不必通过AJAX就能工作。同样,此代码在任何其他浏览器(包括Android浏览器)中都能完美工作,只是不在Edge或IE中。我只是更改了使用
/wp admin/admin post.php
url的逻辑,得到了相同的行为,这次重定向到
http://example.com/wp-admin/admin-post.php
<form action="<?php echo admin_url('admin-ajax.php'); ?>" method="post">
    <?php wp_nonce_field('myplugin_generate_report','abcd'); ?>
    <input name="action" value="myplugin_generate_report" type="hidden">
    <input type="submit" value="Generate report">
</form>