Меня не устраивает неприятная проблема, связанная с экспортом отчета. Обычно нажимается кнопка, и на стороне сервера создается отчет с использованием следующего 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!');
}
});
Операция «build» контроллера экспорта создает отчет во временный файл на сервере. Если это удается, вызывается операция вывода для вывода этого файла в скрытый 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);
}
Проблема, с которой я столкнулся, заключается в следующем: хотя однажды это работает нормально, сеанс кажется разрушенным после первой успешной загрузки файла. То есть, когда пользователь переходит на другую страницу, кажется, что создается новый идентификатор сеанса. Это также требует от пользователя повторного входа в систему, если используется базовая аутентификация, со следующим действием, которое он предпримет.
Проблема кажется очень неустойчивой, и это, кажется, случается время от времени, а не в другое время.
Есть у кого-нибудь идеи? Должен ли я добавить больше заголовков или что-то еще, чтобы предотвратить разрушение сеанса пользователя?