Java-Servlet: Probleme beim File-Upload

Gast #1955413
Lesenswert?

Hallo,
ich habe einen ganz komischen Fehler:

Rufe ich das Servlet auf (GET), wird im Browser ein Formular gezeigt:

[h1]Servlet File Upload[/h1>

[html][head]
[title]fileUpload2[/title]
[/head][body]
[form action="" method="post" enctype="multipart/form-data"]
[input type="file" name="datei" maxlength="100000" 
accept="*"/][br/][input type="submit" value="submit" ][/form]
[/body][/html]

Waehle ich eine text- oder html-Datei beim Upload an, funktioniert alles 
wunderbar.
Waehle ich eine Binaerdatei, erscheint auch die Datei-Dialog-Box.
Nach dem Bestaetigen mit 'Submit'
kommt eine weitere Dialogbox:

 Openinig file binaer-datei
 You have chosen to open binaer-datei which is a BIN file from 
http://localhost:8080
Would you like to save this file?

(Danach wird nichts hochgeladen, sondern die ausgesuchte Datei wird 
lokal noch mal im Download-Ordner gespeichert/kopiert)

Browser: Firefox-Englisch
Server: Tomcat
Was stimmt hier nicht? Irgendwie macht der Browser was falsches. 
Komischerweise funktioniert der File-Upload bei PHP-CGI-Programmen.
Gast #1955482
Lesenswert?

Ich habe heute mehrere Stunden nach dem Problem gesucht.
Kaum habe ich den Thread gestartet, bin ich auf eine Loesung gestossen, 
verstehen tue ich es immer noch nicht.

Und zwar lasse ich im Servlet den raw Content anzeigen:
Bei der Textdatei sieht das so aus:
1
getContentLength()=221
2
-----------------------------1055720534112316391269426325
3
Content-Disposition: form-data; name="datei"; filename="1.txt"
4
Content-Type: text/plain
5

6
1
7
2
8
3
9

10

11
-----------------------------1055720534112316391269426325--
1
BufferedReader bufrd=request.getReader();
2
String s;
3
while((s = bufrd.readLine()) != null) {
4
  out.println(s);
5
}
6
bufrd.close();


Bei einer Binaerdatei sieht es aehnlich aus, nur dass base64 codiert 
wird.
Aber dann sieht die Seite fuer den Browser so aus, als ob der Browser 
einen Download angefordert hatte. Somit versucht er die (nicht 
angeforderte) Datei zu speichern

Wenn ich den Servlet-Code abaendere, z.B.
1
while((s = bufrd.readLine()) != null) {
2
  //out.println(s);
3
  i++;
4
}
5
out.println("i="+i);

kann man sehr wohl Binaerdateien "hochladen".
Die angezeigte Seite hat den Browser "verwirrt".
Warum dieser Fehler bei text-Dateien nicht auftritt, kann ich nicht 
erklaeren.

PS: Das ist kein sinnvolles Programm, lediglich Experimentierphase.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren