2012-11-26 7 views
2

J'ai un Servlet qui fait et retourne un fichier zip Quelque chose comme çamessage après le téléchargement

response.setHeader("Pragma","Public"); 
      response.setHeader("Cache-Control","must-revalidate,post-check=0,pre-check=0"); 

      response.setContentType("application/octet-stream"); 

      response.setHeader("Expires", "0"); 
      response.setHeader("Content-Transfer-Encoding", "binary"); 
      if(file.getName().contains("–")){ 
       response.setHeader("Content-Disposition", "inline; filename=\"file.zip\""); 
      } 

      OutputStream os = response.getOutputStream(); 
      ZipOutputStream zos = new ZipOutputStream(os); 
      for (File f : files) { 
       //add files, it's working... 
       } 
       bis.close(); 
       fis.close(); 
       zos.closeEntry(); 
      } 
      zos.flush(); 
      zos.close(); 
      os.flush(); 
      os.close(); 

Actuellement télécharger J'utilise un iframe, donc je mets l'attribut src pour commencer le téléchargement. Les charges de cadre de téléchargement appel lorsque cette fonction

function loadIDownloadFrame(url) { 
    document.getElementById("idownloadFrame").src=url; 
} 

Mais maintenant, je dois montrer un message de retour après le fichier zip sans quitter la page en cours. J'ai besoin de savoir si la servlet a retourné le fichier zip.

J'ai essayé d'obtenir le statut iframe avec "window.frames ['idownloadFrame']. Document.readyState", mais toujours status est "complete".

Quelqu'un a des solutions?

+0

Qu'essayez-vous de faire? Tu n'as aucun sens. – feeela

+0

Je dois créer un "téléchargement multiple", j'ai dans un dossier 6000+ fichiers, donc le processus de compression est lent et j'ai besoin de montrer un chargement pendant ... Comment puis-je fermer le chargement? –

+1

@Lucas Merencia: Vous devriez repenser cela, zipper 6k + fichiers synchroniquement va tuer votre serveur (s) sous charge, il suffit de considérer comment la quantité de mémoire (RAM) et/ou réseau IO. Laisser l'utilisateur déclencher un travail et retourner un identifiant de transaction au navigateur, puis utiliser une fonction JS pour déclencher l'état du travail. Si le travail terminé offre un bouton de téléchargement (c'est une description de très haut niveau) ... – home

Répondre

1

Je pense que vous pouvez vous référer directement au lien de téléchargement vers la servlet mappée (qui retourne le binaire téléchargeable). Il ne changera pas la page si vous définissez l'en-tête approprié dans la servlet mappée pour retourner le binaire, à partir de l'extrait de code, il semble que vous le faites déjà. Pourquoi devez-vous télécharger un fichier dans un iframe différent? Vous n'avez pas nécessairement besoin de ça.

Où devez-vous montrer le message? Comme une alerte JavaScript ou quelque chose?

+0

En fait, j'ai besoin de fermer un chargement lorsque le processus de compression se termine. –

+2

Je pense que vous devriez penser à une stratégie différente pour le faire, comme le rendre asynchrone. Avec votre approche actuelle, vous connecter une connexion chaque fois que l'utilisateur essaie de télécharger. Vous devriez plutôt générer un thread et compléter la demande dès que possible avec un code de réponse indiquant que les fichiers sont compressés. – ch4nd4n

Questions connexes