我对导出报告的烦恼问题感到茫然。基本上,按下按钮并使用以下javascript在服务器端生成报告: -
__callExportController(true, { op: 'build', type: exportType }, function(data) {
var outputURL = './reportinc/export_controller.php?op=output&filename=';
var reportFilename = data['filename'];
var reportTitle = data['title'];
if (reportFilename && reportTitle) {
var resultURL = outputURL + reportFilename + '&title=' + reportTitle;
/* Initiate the download dialog */
if (!$('#exportFrame').length) {
var hiddenIFrame = document.createElement('iframe');
hiddenIFrame.setAttribute('id','exportFrame');
document.body.appendChild(hiddenIFrame);
}
$('#exportFrame').attr('src', resultURL);
} else {
error('No filename or report title specified!');
}
});
导出控制器的“构建”操作会将报告构建到服务器上的临时文件中。如果成功,则调用“输出”操作以将该文件输出到隐藏的iframe,以便向用户提供下载提示。 Internet Explorer 6/7是此处使用的唯一浏览器。
这是服务器上的输出处理程序,iframe将使用成功构建的文件名进行请求: -
/* Output handler */
case 'output':{
$filename = $_GET['filename'];
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Type: application/pdf");
/**
* NOTE: It appears this is required for some versions of adobe!
* http://www.acrobatusers.com/forums/aucbb/viewtopic.php?id=15400
*/
header("Cache-Control: private");
header("Pragma: cache");
header("Content-Disposition: attachment; filename=\"file.pdf\"");
header('Content-Length: ' . filesize($filename));
/* Flush the headers immediately for larger files */
ob_clean();
flush();
readfile($filename);
@unlink($filename);
}
我遇到的问题是:虽然这个工作正常,但在第一次成功下载文件后,会话似乎被破坏了。也就是说,当用户导航到另一个页面时,他们似乎生成了新的会话ID。这还要求用户必须“重新登录”,如果基本身份验证正在使用,他们将采取下一步行动。
这个问题似乎很间歇,似乎有时会发生而不是在其他时间发生。
有没有人有任何想法?我是否应该添加更多标题或其他内容以防止用户会话被销毁?
答案 0 :(得分:1)
如果iframe的顶级域不相等,则Ie将恢复为p3p协议并删除会话。添加标题将解决此问题。
http://weblogs.asp.net/coltk/archive/2010/10/13/session-lost-in-iframe-p3p-issue.aspx
答案 1 :(得分:0)
可能是您遗失的某个session_name
或session_start
。
或者,更有可能的是,您的用户已禁用Cookie。这样会话仅对一个站点请求有效