Forum: PC-Programmierung Java-Servlet: Probleme beim File-Upload


von Ing. ET (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich glaube eher das das Servlet keine Binärdatein verarbeiten kann, was 
geschieht den mit einer "hochgeladenen" Datei normalerweise?

von Ing. ET (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Da du deinen Browser nicht genannt hast kann man nur mutmaßen, aber 
einige IE Versionen haben eine art "Contenterkennung" und dekomprimieren 
z.B. gz komprimierte Daten beim DL gleich.
Da wundert man sich natürlich wenn man dann die .gz Datei entpacken 
möchte und die Fehlermeldung erhält "dies ist keine gepackte Datei" ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.