我知道这个问题已经在这里被问过好几次了,我在这里使用了很多建议,但没有一个对我有用。
我的应用程序首先创建一个提要列表,然后用户选择要导出的提要。php 文件为每个提要动态生成一个 csv 文件并将它们添加到 zip 文件中。最后,我只是关闭 zip 文件并使用readfile($zipfile).
在 Firefox 中使用 FireBug 对其进行调试时,响应标头与预期一致,并且响应也是二进制格式。但这不会在浏览器上生成保存对话框。
现在,如果我将要导出的 URL 直接粘贴到新窗口并单击,则会出现对话框。
那么这里缺少什么,为什么现有页面不能生成对话框呢?
这是我的代码。
公共函数 export_feeds($start, $end, $feedIds)
{
//要导出的文件名
$date = date('Y_m_j_H');
$fileName = 'Feeds_'.$date.'.zip';
// 我们创建 ZIP 文件
$zip = 新的 ZipArchive;
$result_zip = $zip->open($fileName, ZipArchive::CREATE); // 我们打开文件
如果($result_zip === TRUE){
//遍历feedId的每一行并找到引擎。从特定引擎类调用导出函数并收集数据
$feedIdsArry = explode(":",$feedIds);
foreach ($feedIdsArry as $value) {
$qresult = $this->mysqli->query("SELECT engine, name FROM feeds WHERE `id` = '$value'");
$row = $qresult->fetch_array();
if ($row['engine']==Engine::TIMESTORE) {
//$tableContent = $this->timestore->exportTable($value,$start,$end);
$tableContent = $this->mysqltimeseries->exportTable($value,$start,$end); //临时锻炼
$tableContent = implode("\n", $tableContent);
}
if ($row['engine']==Engine::MYSQL) {
$tableContent = $this->mysqltimeseries->exportTable($value,$start,$end);
$tableContent = implode("\n", $tableContent);
}
$localFileName = $row['name'].'_'.$date.'.csv';
$zip->addFromString($localFileName, $tableContent);
}
$zip->close();
}
别的 {
echo '失败,代码:' . $result_zip;
}
header("Pragma: public");
header("过期时间:0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("缓存控制:公共");
header("内容描述:文件传输");
header("内容类型:应用程序/zip");
header("内容配置:附件;文件名=".$fileName);
header("内容传输编码:二进制");
header("内容长度:".filesize($fileName));
if(!file_exists($fileName)) {
die('找不到压缩文件');
}
别的 {
读取文件($文件名);// 下载 ZIP 文件
}
出口;
}
这是来自 Firebug 的响应标头
公共缓存控制 连接保活 内容描述文件传输 内容处置附件;文件名=Feeds_2013_10_24_14.zip 内容长度 1600 内容类型应用程序/强制下载 日期 2013 年 10 月 24 日星期四 01:39:38 GMT 过期 0 保活超时=5,最大值=100 语用公共 服务器 Apache/2.4.6 (Win32) PHP/5.5.4 X-Powered-By PHP/5.5.4 内容传输编码二进制