Einfaches parsen von multipart form-data

StehtimSchilf

Erfahrenes Mitglied
Hi Forum

ich habe eine simple Webseite welche mit meiner simplen Java-Appli (nicht Servlet!) via POST kommuniziert!

So, jetzt möchte ich meiner Java-Appli via

<form action="" enctype="multipart/form-data" method="post">

eine Datei übergeben.

Bisher hatte ich nur simple Forms mit simplen <input type=text>-Werten im OutputStream, doch nun kommen eben komplexere Daten daher:

-----------------------------324392462611323
Content-Disposition: form-data; name="UserConfigFile"; filename="chart.png"
Content-Type: image/png

Hier sind ganz lustige Zeichen

-----------------------------324392462611323
Content-Disposition: form-data; name="action"

uploadUserConfigFile
-----------------------------324392462611323
Content-Disposition: form-data; name="sessionid"

3569945925846696
-----------------------------324392462611323--


Ich suche jetz ein simples Stück Code um diesen Text zu parsen, damit ich am Ende:
- eine Datei auf der Platte habe
- Werte der Attribute (name=) z.B. in einer ArrayList, egal was
gespeichert habe.

hat mir jemand so etwas? Ich möchte nicht 10 Klassen implementieren nur damit ich dies realisieren kann, auch wenn diese 10 Klassen OOP super hübsch sind!

Ich danke euch!

cheerioh
SiS
 
Hi zeja

thx für Deinen Link, doch den Apache http client habe ich schon und ich finde dort drin irgendwie nur, wie ich eine Multipart-Meldung versende! Nicht jedoch diese parse!

Mir ist bewusst, dass ich auf dem Wege bin das Rad zweimal zu erfinden, aber - aber manche Leute haben Zeit :)

cheerioh & Thx
SiS
 
Na toll, dieses hatte ich auch schon - aber hatte nach dem Download keine Lust die Sourcen nach dem Teil zu durchforsten den ich brauche - aber mit Deinem Link brauch ich nur genau 3 Klassen von diesem Packages - super!

Doch nun hab ich ein kleines Problem:


Code:
s. code vom Link

ByteArrayOutputStream data = new ByteArrayOutputStream();

s. code vom Link

FileOutputStream fos = new FileOutputStream("C:/x.dat");
fos.write(bos.toByteArray());
fos.flush();
fos.close();

Nun habe ich den Inhalt einer Datei C:\x.dat!

So, das sieht sehr sauber aus, doch wenn ich bspw. ein binär-Datei rauflade (.png, gif, exe, .doc) dann stimmt zwar die Dateigrösse, aber einige Zeichen werden falsch gespeichert und zwar immer als Hex-Wert 3F! HEX 90, 9D, 81 alles wird zum HEX-Wert 3F geschrieben und somit ist die Datei natürlich futsch! Ich hab auch schon einen DataOutputStream verwendet - nix! Was müsste ich also am Source (s. Link) anpassen, damit ich den Inhalt von Binärdateien korrekt speichern kann? Textdateien sind kein Problem, da stimmt alles!

thx & Gruess
SiS
 
Kannst du ein vollständig lauffähiges Beispiel posten was dein Problem zeigt? Ich hab nicht die Zeit mir selber was zusammen zu basteln.
 
Hi

Anbei ein lauffähiges Beispiel.

Ich habe alle meine verschiedenen Helper-Funktionen in eine Klasse Utils() gepackt. Der betreffende Code befindet sich in MultipartParserTest.run().

1. Port in MultipartParserTest.main() definieren
2. kompilieren und starten
3. http://localhost:[definierter Port] in Browser öffnen
4. bspw. eine Textdatei senden
5. Im Projekt-Root-Ordner die Datei ansehen: i.O.
6. bswp. ein jpg senden
7. Im Projekt-Root-Ordner die Datei mit der original jpg. vergleichen -
Hex-Werte stimmen nicht überall

Hoffe Du findest den Fehler?

Liegt es evtl. in diesen Zeilen?

Code:
// Post Request eineseln
int contentLength = Integer.parseInt(httpContentLength);
StringBuilder requestContent = new StringBuilder();
for (int i = 0; i < contentLength; i++) {
    requestContent.append((char) in.read());
}
									
// Inhalt des Post Requests in die Linie schreiben
line = requestContent.toString();

cheerioh & hab Dank
SiS
 

Anhänge

Hi

hab heute den ganzen Tag geguugelt und bin auf diese Anpassung gekommen:

Ich öffnete den InputStream von meinem Socket bisher so:
Code:
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

Nun öffne ich den InputStream vom Socket so:
Code:
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), Charset.forName("ISO-8859-1")));

Für den MultipartStream ändere ich das Charset ebenfalls.

bisher:
Code:
ByteArrayInputStream input = new ByteArrayInputStream(line.getBytes());
MultipartStream multipartStream =  new MultipartStream(input, boundary);

neu:
Code:
ByteArrayInputStream input = new ByteArrayInputStream(line.getBytes("ISO-8859-1"));
MultipartStream multipartStream =  new MultipartStream(input, boundary);

wobei in line (Typ String) der content des Requests steht.

jetzt tuts in IE und FF. Was ist aber, wenn ich bspw. in Argentinien einen FF öffne? Ist dann das Charset anders? Müsste ich zuerst aus dem Header-Attribute Accept-Charset das Charset auslesen und dann bei line.getBytes() das entsprechende angegben?

Oder einfachere Frage: Wie muss ich vom Socket den InputStream öffnen, dass ich nicht wieder über die Zeichenkodierung stolpere?

Habt Dank!
cheerioh
SiS
 

Neue Beiträge

Zurück