2009-09-23 5 views
0

Je suis à court d'un problème ennuyant lié à l'exportation d'un rapport. En gros, un bouton est pressé et un rapport est généré côté serveur en utilisant le javascript suivant: -Une session a été perdue de façon inattendue?

__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!'); 
    } 
}); 

L'opération « build » du contrôleur d'exportation construit le rapport dans un fichier temporaire sur le serveur. Si cela réussit, l'opération 'output' est appelée pour sortir ce fichier dans un iframe caché afin d'obtenir l'invite de téléchargement à l'utilisateur. Internet Explorer 6/7 sont les seuls navigateurs utilisés ici.

C'est le gestionnaire de sortie sur le serveur qui l'iframe va demander le nom de fichier construit avec succès: -

/* 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); 
} 

La question que je vais avoir est: tout cela fonctionne bien une fois, la session semble être détruit après le premier téléchargement de fichier réussi. Autrement dit, lorsque l'utilisateur navigue sur une autre page, il semble qu'un nouvel identifiant de session lui soit généré. Cela implique également que l'utilisateur doive se reconnecter si l'authentification de base est utilisée avec l'action suivante.

Le problème semble très intermittent et il semble arriver parfois et pas à d'autres moments.

Avez-vous des idées? Dois-je ajouter plus d'en-têtes ou quelque chose pour empêcher la destruction de la session des utilisateurs?

Répondre

0

peut être votre un session_name ou session_start quelque part.

ou, plus probablement, les utilisateurs ont des cookies désactivés. de cette façon, les sessions ne sont valides que pour une demande de site

+0

Hmmm, je suis sûr que la session est en cours de démarrage partout et cela est une application basée sur l'intranet interne afin * les cookies doivent être activés définitivement * partout. C'est particulièrement frustrant car il semble bien fonctionner maintenant, très intermittent :( –

+0

peut-être que votre fichier/tmp est nettoyé régulièrement, et ainsi vos sessions sont effacées de la même manière – knittl

Questions connexes