2009-04-24 2 views
1

Ich habe ein Servlet, das eine Datei sendet, indem Sie den HTTP Content-Type auf "application/zip", die Content-Disposition auf "attachment" setzen und auf die Antwort schreiben OutputStream; Es verhält sich korrekt, wenn es auf meinem lokalen Anwendungsserver bereitgestellt wird, wodurch der Browser das Popup anzeigt, um auszuwählen, ob die Datei heruntergeladen werden soll oder nicht.Datei-Download-Servlet verhält sich anders mit IE auf Cluster-Server

Bei der Bereitstellung auf einem geclusterten jboss-Server hängt der IE jedoch bei 0% an, um Dateiinformationen für die gesamte Übertragung anzufordern, und schlägt dann mit einer Fehlermeldung fehl, die besagt, dass die Datei nicht zum Download verfügbar war: noch seltsamer ist dies Mit FF und Chrome verhält sich das Servlet korrekt, also genauso wie bei localhost.

Irgendwelche Hinweise?

kann ich einen kleinen Ausschnitt aus dem bedeutenden Teil des Codes Servlet bietet auch:

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(); 

Ich weiß nicht wirklich, ob das Problem in meinem Servlet-Code oder in der Cluster-Server-Konfiguration liegt, aber ich Ich fange an zu erraten, dass die zweite Chance die richtige sein könnte ... irgendwelche Ideen, was in meiner Clusterkonfiguration falsch sein könnte?

+0

Verwenden Sie eine SSL-Verbindung, wenn Sie die Anwendung auf dem gruppierten JBoss-Server testen? Wenn ja, könnte das die Erklärung sein - ich hatte vor einer Weile ein ähnliches Problem. – simon

+0

Nein, plain HTTP auf beiden Servern – Raibaz

+1

Beobachtungen, die nicht mit Ihrem Problem zusammenhängen: Es gibt keinen "name" -Parameter für Content-Type. Auch der Dateiname-Parameter in Content-Disposition schlägt fehl, wenn der Dateiname Dinge wie Kommas, Leerzeichen oder Nicht-ASCII-Zeichen enthält. –

Antwort

1

Ok, ich habe es behoben.

Der Load Balancer, der zwischen dem Client und den einzelnen Cluster-Servern stand, fügte jeder HTTP-Antwort "Cache-Control: no-cache" hinzu, was dazu führte, dass IE verrückt wurde.

Das Entfernen der Header-Anweisung löste das Problem.

1

Dies ist möglicherweise ein Ergebnis von IE Verhalten in diesen Artikeln beschrieben:

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

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

Ich hatte ein ähnliches Problem (nur mit Tomcat), das nur dann, wenn die Dateigröße aufgetreten war groß genug. Sie können leicht testen, ob dies der Fall ist, indem Sie die Zeit vom Start des Downloads bis zur Fehlermeldung messen - wenn diese Zeit konstant ist, haben Sie wahrscheinlich den gleichen Fehler. Sie sehen den Fehler möglicherweise nicht lokal, da die Dateien schnell genug geladen werden.

Wenn das Zeitlimit aus der Zeit resultiert, in der die Datei generiert wird, besteht eine Lösung darin, die Datei asynchron zu erstellen und den Download erst zu starten, nachdem die Datei zum Herunterladen bereit ist.

+0

Die Datei ist bereits asynchron erstellt, daher kann es kein Problem bei der Erstellung sein, und ich glaube nicht, dass sie mit dem Zeitlimit des Browsers zusammenhängt, da sie sich sowohl lokal als auch auf dem Remotecomputer korrekt verhält Cluster – Raibaz

Verwandte Themen