# Bilder werden nicht angezeigt



## dips (11. Jun 2008)

Halllo liebe Foris,

die Situation:
der User kann über ein Formular ein Bild hochladen. Dieses wird im Dateisystem des Servers gespeichert. Danach kann sich der User das hochgeladene Bild ansehen.

eigentlich klappt auch alles wenn man den Server und den Client auf dem gleichen Rechner laufen hat, aber sobald ich es von einem anderen Rechner aus versuche, werden die bilder nicht mehr angezeigt. alles andere klappt: hochladen, speichern im html steht sogar der richtige pfad zum bild drin...ich verstehs nicht

hat da vielleicht jemand ne idee?

schöne grüße
dips


----------



## ms (11. Jun 2008)

Zeig doch mal den Pfad.

ms


----------



## Guest (11. Jun 2008)

Hallo

also in meiner jsp, die die Bilder anzeigen soll steht:


```
<c:if test="${newQuestion.questionTyp eq 'PICTURE'}">
${newQuestion.imageName}

[img]${imgaeDirectory}/Question/${newQuestion.id}/${newQuestion.imageName}[/img]
</c:if>
```

gespeichert werden die bilder so:


```
public void saveImage(WithImage entity, MyImage image) {
		File file = new File(MyPropertyReader
				.getProperty("questionmanagement.question.iconlocation")
				+ "/" +entity.getClass().getSimpleName()+"/"+ entity.getId());
		file.mkdirs();
		try {
			ImageIO.write(image.getImage(), "jpg", new File(file
					.getAbsolutePath()
					+ "/" + entity.getImageName()));
		} catch (IOException e) {
			System.out.println("fehler im bild speichern");
			e.printStackTrace();

		}
	}
```

und die Property questionmanagement.question.iconlocation ist ein Pfad : 
	
	
	
	





```
D:/testapplicaton/data/images
```

irgentwie können die bilder nicht übers netzwerk angezeigt werden, glaub ich...
die frage ist: wie mach ich das dann?


----------



## ms (11. Jun 2008)

Ich meinte den img-Tag im Html-Output. Auf welche URL zeigt das src-Attribut?
Und wo liegt das Bild tatsächlich?

ms


----------



## dips (11. Jun 2008)

achso   also im html output steht:







und das bild is aufm dem server in folgendem Ordner: D:\testapplicaton\data\images\Question\2\maus.jpg

stimmt genau überein, und wenn ich server und client vom gleichen rechner aus ausführe gehts ja auch

ich glaube fast, dass des ganz einfach ist und ich raffs einfach nur nich 

danke für die hilfe im voraus


----------



## ms (11. Jun 2008)

D:\ ... geht immer auf den lokalen Rechner.

Wie ich sehe verwendest du JSTL. 
Schau dir mal den c:url -Tag an.

ms


----------



## dips (11. Jun 2008)

mhh... ich versteh nicht ganz wie c:url mir da weiterhelfen soll...ich hab gefunden das der tag zum rewrite von URLs benutzt werden kann, aber wie komm ich denn damit an das bild auf dem server??

kapier ich nich *sorry* kannst du mir das erklären?
schöne grüße 
dips


----------



## dips (11. Jun 2008)

also ich hab mich mal weiterbelesen  mit <c:url> kann man schon auf bilder verweisen, aber so wie ich das verstanden habe, komm ich damit nich aus dem servlet kontext raus

es können also meiner meinung nach damit nur quellen angegeben werden, die sich im servlet context befinden, also beim deployen schon im webapplikationsverzeichnis sind!

seh ich das richtig?

wenn ja dann denke ich mir weiterhin, dass die bilder, die ich hochlade nicht im servlet kontext sind, weil ich die ja irgentwo im verzeichnisbaum des servers ablege und in die .war datei kann ich sie ja schlecht reintun...

wenn meine Überlegungen totaler Schwachsinn sein sollten *hehe* war n versuch  und vielleicht kannst du mich ja berichtigen

die frage ist nun trotzdem noch: wie komm ich an die hochgeladenen bilder ran  oder ist es überhaupt möglich sie darzustellen?? hab noch von einer möglichkeit gelesen bilder als blob in die datenbank zu packen...aber ich glaub irgentwie nicht das des so sinnvoll wäre 

schöne grüße
dips


----------



## Guest (11. Jun 2008)

Wenn der Browser in einer HTML-Seite folgendes findet


```
[img]D:/testapplicaton/data/images/Question/2/maus.jpg[/img]
```

versucht er das Bild von der _lokalen_ D-Platte des Client zu laden und nicht von der D-Platte des Servers. An die kann er auch garnicht herankommen.

Wenn das Bild außerhalb des Context liegt muß du es z.B. über ein Servlet innerhalb deines contexts senden, also von der Platte laden und auf den ServletOutputStream senden.


----------



## maki (11. Jun 2008)

Brauchst so etwas wie ein "stream servlet" wenn Dateien an den Client (Browser) gesendet werden sollen die nicht im Context liegen.


----------



## ms (11. Jun 2008)

Wenn du einen Apache vor dem ServletContainer/ApplicationServer geschalten hast kannst du den das erledigen lassen.

c:url erzeugt dir eine Url.

ms


----------



## dips (12. Jun 2008)

soo... ich habs hinbekommen !!!

vielen dank an euch, mit den richtigen stichpunkten findet man sogar die lösung im internet. das problem ist, man weiß meistens gar nich wonach man suchen soll *g*

also meine lösung:

ein servlet  mapped an /application/get_image:


```
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		super.doGet(req, resp);
		String id;
		String typ;
		String imagename;
		try {
			id = getParameter("id");
			typ = getParameter("typ");
			imagename = getParameter("imagename");
			File file = new File(IMAGE_LOCATION+"/"+typ+"/"+id+"/"+imagename);
			resp.setContentType("image/jpeg");
			BufferedImage image = ImageIO.read(file);
			ImageIO.write(image, "jpg", resp.getOutputStream());
		} catch (ParamterIsNullException e) {
			addErrorMessage("Das Bild konnte nicht geladen werden");
		}
    }
```

der jsp aufruf:


```
[img]\application/get_image?id=${newQuestion.id}&typ=Question&imagename=${newQuestion.imageName}[/img]
```

schöne grüße 
dips


----------



## maki (12. Jun 2008)

Falls du auch noch andere Bilder als JPGs streamen möchtest, kannst du dir mal javax.activation.MimetypesFileTypeMap#getContentType(..) ansehen: http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/activation/MimetypesFileTypeMap.html


----------



## Guest (24. Jun 2008)

hallo leute,
ich hab noch ein Problem mit meinem GetImage Servlet.
Kann es sein, dass ein Servlet zwei Sachen gleichzeitg macht?

in meiner jsp ruf ich das servlet so auf:


```
<c:forEach var="ans" items="${newQuestionAnswersTemporal}">
    [img]\application/get_image?tempAnswer=${ans.temporalId}[/img]
</c:forEach>
```

Die Bilder liegen mit den verschiedenen ids als key im session scope. Irgentwie kommt mein servlet da durcheinander und zeigt das falsche Bild an. Hier ist noch mal der servlet code, hab da noch ma n bissel was angepasst:


```
private void showTemporalAnswerImage(HttpServletResponse resp)
			throws IOException {
		try {
			int tempId = Integer
					.parseInt(getParameter(SHOW_TEMPORAL_ANSWER_IMAGE));
			List<Answer> temporalAnswers = (List<Answer>) getSessionAttribut(NEW_QUESTION_TEMPORAL_ANSWER);
			MyImage candiImage = null;
			for (Answer answer : temporalAnswers) {
				if (answer.getTemporalId() == tempId) {
										candiImage = (CandiImage) getSessionAttribut(TEMPORAL_ANSWER_IMAGE
							+ answer.getTemporalId());
					break;
				}
			}
			if (candiImage == null) {
				//image nicht gefunden			
} else {
				BufferedImage image = candiImage.getImage();
				resp.setContentType("image/jpeg");
				ImageIO.write(image, "jpg", resp.getOutputStream());
					}

		} catch (ParamterIsNullException e) {
			//es soll kein bild für eine temporäre antwort gesucht werden
		}
	}
```

Die keys stimmen alle, das hab ich schon tausendmal überprüft, ich kann mir nur vorstellen, dass es daran liegt, dass er mit  
	
	
	
	





```
ImageIO.write(image, "jpg", resp.getOutputStream());
```
 noch nicht fertig ist, wenn er schon das nächste Bild laden möchte.
Kann das sein?
Oder hat jemand eine andere Idee, warum das nicht so richtig funktioniert? Vor allem das Ding ist ja, manchmal zeigt er das richtige Bild beim nächsten request schon wieder nicht...
Schöne Grüße und Dank im Voraus 
Dips


----------



## dips (25. Jun 2008)

hallo liebe fories, ich hab weiter geforscht und gelesen, dass servlets nicht threadsicher sind. ist das vielleicht das problem? und wenn ja wie kann ich es lösen?

schöne grüße dips


----------



## maki (25. Jun 2008)

Zeig doch mal deine doPost Methode.

Und ja, Servlets sind nicht threadsicher, ist aber eine absolute Grundlage der Servlet Programmierung...


----------



## dips (25. Jun 2008)

Hallo maki 
hach...ist mein erstes webprojekt und lieber check ich das mit den threads später als nie *g*


```
@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		super.doGet(req, resp);
		showQuestionImage(resp);
		showTemporalAnswerImage(resp);
		showExistingAnswerImage(resp);
}
```

das ist meine doget methode,

die showTemporalAnswerImage(resp); hab ich ja schon eins vorher geposted. Die showQuestionImage(resp); klappt eigentlich immer soweit ich das probiert habe, liegt dann wohl daran, dass sie nur einmal aufgerufen wird und nicht in einer schleife, wie die anderen beiden methoden...

haste ne idee?
schöne grüße
dips


----------



## maki (25. Jun 2008)

Hat dein Servlet Instanzvariablen?


----------



## dips (25. Jun 2008)

ja hat es


----------



## maki (25. Jun 2008)

Weg damit, haben nix in einem Servlet zu suchen -> nicht Threadsicher


----------



## dips (25. Jun 2008)

*hehe* das wird ein spaß! ich kenn mich nich so aus mit threadsicher, erben dürfen servlets doch von einander oder?
nagut ich bau erstmal die ganzen instanzvariebalen weg 
danke für deine hilfe


----------



## maki (25. Jun 2008)

Klassenvariablen sind auch nciht erwünscht...

Man kann beide haben, sowohl Instanz- als auch Klassenvariablen, allerdings dürfen diese dann nach der Initialisierung nicht mehr verändert werden.

Am besten ohne...


----------

