PHP 显示“打开/保存”对话框

Posted

技术标签:

【中文标题】PHP 显示“打开/保存”对话框【英文标题】:PHP show "open / save" dialog 【发布时间】:2013-09-20 11:17:32 【问题描述】:

我正在使用 php 通过 CSV 生成 Excel 文件。在用我自己的数据填充之前,我正在使用一段非常简单的代码来准备整个函数:

$list = array (
  array('#', 'Registrar', 'Country', 'Website', 'Email Address'),
  array('123', '456', '789', 'aaa', 'bbb'),
  array('123', '456', '789', 'aaa', 'bbb'),
);

$fp = fopen('myfile.xls', 'w');

foreach ($list as $fields) 
  fputcsv($fp, $fields, "\t", '"');


fclose($fp);

代码运行良好。但是,它会自动将“myfile.xls”保存到执行 PHP 文件的目录中。我希望页面显示“打开/保存”对话框,让用户选择他/她想要保存文件的位置。我尝试了一些类似这样的标题技巧:

header ("Content-Type: application/download");
header ("Content-Disposition: attachment; filename=myfile.xls");
header("Content-Length: " . filesize(myfile.xls));

但是,当使用它时,导出的文件会显示页面内容(包括带有标题的页眉、菜单、页脚等),而不是“列表”变量中的数据......我可以' t阻止页眉和页脚包含在PHP页面中,因为它是框架的一部分,所以我只想选择通过PHP的CSV函数生成的“myfile.xls”的存储位置。

我也考虑并尝试使用 PHPExcel 和其他旨在生成 Excel 的软件包,但我无法让它们中的任何一个正常工作。我已经失去了太多天的尝试,所以我决定简单地创建一个 CSV 文件,这对我的目的来说是可以的。我现在唯一需要的是“打开/保存”对话框,它对我来说是完美的。

提前感谢您的时间和精力! :)

【问题讨论】:

大多数框架都提供了一些机制,允许您隐藏自己的标头并使用自己的标头,那么您使用的是什么框架? 嗨,马克!我正在使用 Yii 框架,它总是将其页面“嵌入”到框架中,显示页眉、菜单和页脚...... 我不是框架专家,但肯定有一些内置在 Yii 中的方法可以抑制自己的标题,从而允许您使用自定义标题覆盖它们:例如用于提供非 html 数据 (yiiframework.com/forum/index.php?/topic/…) 嗨,马克,感谢您的宝贵时间!我在框架中找到了一个方法,可以按照你说的做(虽然我还没有实现它,因为它不是那么容易使用)。但是,我认为应该有一种最简单的方法来显示我实际生成的文件的对话框:“myfile.xls”已生成并保存在我的 PHP 脚本的根目录中,我只是想在浏览器中询问我“你想把这个文件存储在哪里?”...没有最简单的方法吗? 这一切都归结为您发送到浏览器的标头;并使用php://output 作为您的文件名...无论您使用的是 PHPExcel、一个简单的 csv(正如您所做的那样)、PDF、图像和 mpeg,以及您想要创建并直接发送到浏览器的任何内容,这同样适用 【参考方案1】:

试试下面的代码

$file = "location of file to download"
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();

【讨论】:

嗨,维沙尔!我试过你的代码,但我无法让它工作......我已经在我的代码之前和之后粘贴了它(将“$file”更改为“$fp”,这是我的文件变量)但它的行为很奇怪:该页面显示一种 404 错误,就好像它找不到文件一样... 注释 $file 变量出现的两行会使页面打开 PHP 文件的下载对话框。但是,我无法让代码下载我的 XLS 文件,因为它显示“找不到您正在执行的 PHP 页面”错误...奇怪...:S 尝试给出下载文件的完整路径 我不确定我是否理解得很好,但是要下载的文件是在PHP脚本本身中生成的,所以我无法给出它的完整路径... PHP生成一个新的 XLS 文件,我想让用户选择是打开还是下载新创建的文件。

以上是关于PHP 显示“打开/保存”对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何显示打开/保存对话框 asp net mvc 4

在浏览器中显示文件或先显示“打开/保存”对话框

iTextSharp:创建 PDF 文件时显示“打开/保存”对话框

VBS - 在保存对话框中显示多种文件类型

C# OpenFileDialog和SaveFileDialog:打开文件与保存文件

打开/保存文件对话框