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