Fileupload, Bytes, Cast->String, Bytes
Mirko Rose
- programmiertechnik
Hallo,
ich habe glaube ich ein Verständnisproblem.
Ein Bild wird via Form hochgeladen.
Anschließend stelle ich es dar:
byte[] uploadedPicture = request.getFile('picture').bytes
displayImage(uploadedPicture)
Dies klappt wunderbar.
Testhalber caste ich jetzt diesen Byte-Array zu einem String.
Danach hole ich mir anhand des Strings wieder das Byte-Array.
Eine erneute Ausgabe schlägt dann allerdings fehl!
byte[] uploadedPicture = request.getFile('picture').bytes
displayImage(uploadedPicture.toString().getBytes())
Woran liegt das?
MfG
Mirko
PS: Ich nutze Grails/Groovy.
PPS: Die Funktion displayImage
void displayImage(byte[] picture) {
response.setContentType('image/png')
response.setContentLength(picture.length)
OutputStream out = response.getOutputStream();
out.write( picture );
out.close();
}
Hallo,
Testhalber caste ich jetzt diesen Byte-Array zu einem String.
Danach hole ich mir anhand des Strings wieder das Byte-Array.
Eine erneute Ausgabe schlägt dann allerdings fehl!
Ein String ist ja eine Ansammlung von Zeichen und nicht Bytes. Ein Bild sind nun hauptsächlich Binärdaten und vermutlich ist die Konvertierung von den Bytes zum String (oder die zurück) nicht verlustfrei, weil z.B. irgendwelche besonderen Steuerzeichen ignoriert werden oder ähnliches. Damit erhälst Du nicht mehr die gleichen Bytes nach der Konvertierung wie vorher.
Was mir nicht ganz klar ist: Welches Problem willst Du jetzt eigentlich lösen?
Viele Grüße,
Christian
Hi,
Testhalber caste ich jetzt diesen Byte-Array zu einem String.
PS: Ich nutze Grails/Groovy.
Welches Encoding wird bei toString() vorausgesetzt?
Ich kenne Grails/Groovy nicht (außer vom Namen her), daher kann ich das nicht beurteilen.
Berücksichtige, wie Christian schon schrieb, daß nicht jedes Byte (bzw. jede Byte-Kombination) bei jedem Encoding ein Zeichen darstellt.
Beispiel: Bytes mit Werten über 128 können keine US-ASCII-Zeichen sein.
Aber auch z.B. bei UTF-8 können nicht alle Byte-Kombinationen in Zeichen umgewandelt werden.
In Java kann man bei den Konvertierungen, z.B. beim Konstruktor, neben dem Byte-Array auch die Kodierung angeben, also new String(bytearray, "UTF-8")
Vielleicht kann G/G das ja auch?
Danach hole ich mir anhand des Strings wieder das Byte-Array.
Welchen Zweck außer Zeit-, CPU-Last- und Speicherverbrauch soll das hin- und her-konvertieren denn haben?
cu,
Andreas
Hallo,
danke euch beiden. Ich habe es nun hinbekommen, ich hatte den Algorithmus fuer die Base64-Kodierung falsch angesprochen.
Hintergrund meiner Frage war:
Ein Client ruft eine REST-Schniststelle via JSON auf. Dort ist ein Base64-kodiertes Bild enthalten. Dieses galt es zu dekodieren und in die Datenbank zu schreiben. Beim GET musste ich dieses Bild dann schließlich wieder kodieren und als String im JSON übergeben.
Und bei diesem Hin- und Herkodieren traten die geschilderten Probleme auf.
MfG
Mirko