2009-04-24 6 views
1

J'ai un servlet qui envoie un fichier en définissant le type de contenu HTTP sur "application/zip", le Content-Disposition sur "attachment" et en l'écrivant sur la réponse OutputStream; il se comporte correctement lorsqu'il est déployé sur mon serveur d'applications local, ce qui fait que le navigateur affiche le popup pour choisir de télécharger ou non le fichier. Cependant, lors du déploiement sur un serveur jboss en cluster, IE se bloque sur 0% demandant des informations de fichier pour le transfert entier, puis échoue avec un message d'erreur indiquant que le fichier n'était pas disponible au téléchargement: même le plus étrange avec FF et Chrome, le servlet se comporte correctement, c'est-à-dire de la même manière que sur localhost.Servlet de téléchargement de fichiers se comportant différemment avec IE sur un serveur en cluster

Des indices?

Je peux aussi fournir un petit extrait de la partie importante du code de servlet:

response.setContentType("application/zip; name=" + f.getName()); 
response.setContentLength((int)f.length());  
response.addHeader("Content-Disposition", "attachment;filename=" + f.getName()); 
byte[] buf = new byte[1024]; 
int bytesRead; 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
OutputStream os = response.getOutputStream(); 
while((bytesRead = bis.read(buf)) != -1) { 
    os.write(buf, 0, bytesRead);     
} 
os.flush(); 
bis.close(); 

Je ne sais pas vraiment si le problème se trouve dans mon code de servlet ou dans la configuration du serveur en cluster, mais je Je commence à deviner que la seconde chance est peut-être la bonne ... des idées sur ce qui pourrait être mauvais dans ma configuration de cluster?

+0

Utilisez-vous une connexion SSL lors du test de l'application sur le serveur JBoss en cluster? Si oui, cela peut être l'explication - j'ai eu un problème similaire il y a un certain temps. – simon

+0

non, HTTP simple sur les deux serveurs – Raibaz

+1

Observations, non liées à votre problème: il n'y a pas de paramètre "nom" sur Content-Type. En outre, le paramètre filename sur Content-Disposition échouera si le nom de fichier contient des éléments tels que des virgules, des espaces ou des caractères non-ASCII. –

Répondre

1

Ok, je l'ai corrigé. L'équilibreur de charge se trouvant entre le client et les serveurs de cluster individuels ajoutait «Cache-Control: no-cache» à chaque réponse HTTP, ce qui provoquait la colère d'IE.

La suppression de la directive d'en-tête a résolu le problème.

1

C'est peut-être en raison du comportement IE décrit dans ces articles:

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B181050

http://support.microsoft.com/default.aspx/kb/813827

J'ai eu un problème similaire (uniquement avec Tomcat), ce qui ne se produisait si la taille du fichier était assez large. Vous pouvez facilement tester si c'est le cas en mesurant le temps entre le début du téléchargement et le message d'erreur - si cette heure est constante, vous avez probablement la même erreur. Vous ne voyez probablement pas l'erreur localement, car les fichiers se chargent assez rapidement.

Si le délai d'attente résulte de la génération du fichier, une solution consisterait à créer le fichier de manière asynchrone et à commencer le téléchargement une fois le fichier prêt à être téléchargé.

+0

Le fichier est déjà créé de manière asynchrone, donc il ne peut pas être un problème avec sa génération, et je ne pense pas qu'il soit lié au délai d'expiration du navigateur car il se comporte correctement localement et sur la machine distante quand je ne passe pas par grappe – Raibaz

Questions connexes