# Mehrere Bilder gleichzeitig bzw. dynamisch eines Objektes speichern



## RelaX (1. Jan 2016)

Hallo alle Zusammen,

erst einmal ein schönes neues Jahr und ich hoffe Ihr seit alle super reingekommen.

Ich bin ja im Java EE - Umfeld noch relativ neu und nun versuche ich einen Bilderupload hinzubekommen. Nun stellt sich mir die Frage wie ich das bauen soll.

Ich versuche einfach mal meine Ideen zu beschreiben und hoffe jemand schreibt mal etwas darüber und zeigt mir evt. alternativen dazu auf.

Ein Bild in die Datenbank schreiben und auch mittels Servlet wieder abzurufen stellt momentan nicht das Problem dar. Ich würde die Bilder gerne in der Verzeichnisstruktur speichern damit beim Abruf die Datenbank nicht belastet wird. Das war zumindest mein Gedanke dabei. Also nicht falsch verstehen, es werden die Bilder auch in der Datenbank gespeichert bzw. das Original. Da aber ja das Objekt nicht nur ein sondern auch mehrere Bilder haben soll, muss ich hier ja eine ManyToOne-Beziehung einrichten. So weit so gut.

Beim Speichern, werden dann die Bilder in der Verzeichnisstruktur abgelegt. Einmal ein großes nach folgendem Schlüssel: 
*Classname*/*id*/*number*_original
*Classname*/*id*/*number*_middle
*Classname*/*id*/*number*_thumb

Also es wird dann das selbe Bild scalliert abgespeichert. Jetzt stellt sich mir allerdings die erste Frage.

Ich muss ja beim Speichern erst das Objekt an sich speichern, damit ich eine id bekomme oder? Und erst dann wenn das speichern des Objektes erfolgreich war, werden die Bilder skalliert und gespeichert.

Ok weiter mit der Update- und Deletefunktionalität.
Beim Update sowie beim Löschen muss ich ja auf die Verzeichnisstruktur zugreifen. Das muss ja auch händisch programmiert werden.

Wenn ich das alles so sehe könnte man auf die Idee kommen eine Bilder-Speicher-Bean zu bauen, die vollkommen ohne Beziehungen arbeitet. Dann müsste ich keine Bilder-Beziehung pflegen. Einzig der Classname und die ID wären dann der zusammengesetzte Schlüssel zur Identifikation.

Problem hierbei: Ich brauch eine existierende ID eines Objektes wenn ich Bilder speichern möchte. Im Controller müsste ich ja dann trotzdem zuerst das Objekt speichern, und dann die Bilder.

Es wäre super wenn ihr mal eure Gedanken dazu schreibt. Ist die Idee überhaupt sinnvoll oder eher weniger? Was für Nachteile seht ihr darin?

Gruß


----------



## stg (3. Jan 2016)

Der Pfad bzw Datei-Name zum Bild muss nicht wissen zu welchem Datenbankeintrag er gehört, es reicht aus sich die andere Richtung zu merken. 
In der Datenbank solltest du (sofern du keine triftigen Gründe dafür hast) das Bild gar nicht speichern, sondern nur einen Verweis auf das Bild im FileSystem. 
Ja, es bietet sich an dafür eine Session Bean zu schreiben, die genau das macht. Bedenke aber, dass du hier Probleme mit Skalierbarkeit usw kriegen kannst.


----------



## RelaX (5. Jan 2016)

Also ich hab das jetzt so geregelt das ich die Bilder im Falle eines Backups doch auch in der Datenbank speichere. Die Abfrage funktioniert allerdings über die Speicherung im Dateiverzeichnis. Somit kann ich beim einspielen eines Backups auch die Bilder wieder herstellen. Nach ganzen Zwei Tagen hab ich es sogar hinbekommen Bilder via Ajax an die ViewScoped-Bean zu senden und dann als Vorschau wieder darzustellen. Bei einem submit werden diese Bilder dann gespeichert. Sowohl in der Datenbank als auch im Verzeichnis. Ich hab jetzt echt 2 Tage damit verbracht Bilder als byte[] in der Bean zu halten und diese dann nochmal zu rendern als Vorschau via Javascript. Erst wenn submitted wird, wird richtig gespeichert. Ich hatte das Problem das ich mit dem <h:inputFile> probleme hatte. Hat sich aber erledigt. Nun klappt alles. Danke für die Antwort!


----------

