mikrocontroller.net

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


Autor: Ing. ET (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Ing. ET (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
getContentLength()=221
-----------------------------1055720534112316391269426325
Content-Disposition: form-data; name="datei"; filename="1.txt"
Content-Type: text/plain

1
2
3


-----------------------------1055720534112316391269426325--
BufferedReader bufrd=request.getReader();
String s;
while((s = bufrd.readLine()) != null) {
  out.println(s);
}
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.
while((s = bufrd.readLine()) != null) {
  //out.println(s);
  i++;
}
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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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" ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.