# Bilder nach dem Upload nutzen



## kinglui (20. Jan 2011)

Hallo zusammen,

ich würde gerne Bilder, welche ich per <tr:inputFile hochlade, direkt wieder anzeigen lassen.
Dazu habe ich folgenden Code:

```
package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;

import java.util.ArrayList;

import javax.faces.event.ValueChangeEvent;

import org.apache.myfaces.trinidad.model.ChildPropertyTreeModel;
import org.apache.myfaces.trinidad.model.UploadedFile;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.apache.myfaces.trinidad.model.UploadedFile;


public class bt {
  private String img = "/img/flagge_de.jpg";
  
    public void setImg(String img) {
        this.img = img;
    }

    public String getImg() {
        return img;
    }
  
  public void upload(ValueChangeEvent vc) throws IOException {
    UploadedFile file = (UploadedFile)vc.getNewValue();
    String save = "";
    String[] filenameArray = new String[6];
    if (file != null) {
        int n = 0;
        InputStream is = file.getInputStream();
        File f = new File("D:\\uni\\SS10\\webdev\\testJSF\\Project1\\public_html\\img");
        if (!f.isDirectory()) 
            f.mkdir();
        String dir = "D:\\uni\\SS10\\webdev\\testJSF\\Project1\\public_html\\img" ;
        String fileName =  file.getFilename();
        
        save = dir + (File.separator) + fileName;
        FileOutputStream fos = new FileOutputStream(save);
       
          img = "/img/" + fileName;
          this.setImg(img);
          System.out.println(img);
        
        
 
        try {
            //die Datei wird auf den Server geschrieben
            while ((n = is.read()) >= 0)
                fos.write(n);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
        }
    }
  }
    
  
  }
```
in der jspx sieht das dann wie folgt aus:

```
<tr:form usesUpload = "true">
          <tr:inputFile label = "Upload demo" valueChangeListener= "#{bt.upload}"/>
          <tr:commandButton text="Go"/>
        </tr:form>
          
          <tr:image source="#{bt.img}"/>
```

janz rudimentär, wie man sieht (ich hab das mal von meinem richtigen Problem abstrahiert).


Wenn ich jetzt ein Bild hochlade, wird es nicht direkt geändert. erst nach dem neuen deployment des weblogicservers (bzw. live läuft tomcat) kann ich die bilder on-the-file ansteuern.

Ich vermute, dass die "neuen" bilder, nur im lokalen Verzeichnis liegen, nicht aber im Cache des WLS'.

Kann sowas hinkommen?
Wie gesagt, nach dem deployen kann ich die vorhanden Bilder beliebig oft wechseln, wenn sie schon mal "online" waren.

Danke


----------



## kinglui (21. Jan 2011)

also ich habe die ganz App jetzt nochmal so vereinfacht, dass wirklich nur simple per goLink der Link zur Datei (also Variable "img") als destionation gesetzt wird. Wir erwartet bekomme ich einen 404 Fehler.

Muss ich vielleicht außerhalb des Applikationsservers ein Bereich zur Verfügung stehen, auf den ich uneingeschränkt zugreifen kann?

danke


----------



## kinglui (23. Jan 2011)

kommt schon. ziert euch nicht 

hat wirklich keiner ne Idee?  
Dachte echt nicht, dass das so ein Problem darstellen könnte..


----------



## nocturne (24. Jan 2011)

goLink ist uns kein Begriff, eine undefinierte variable quasi. Wir wagen es nicht eine Antwort zu formulieren.

Warum speicherst du die Bilddateien nicht als Bytearray in der Datenbank? Du brauchst dann nur noch ein HTTPServlet das eine Bilddatei zurückgibt.


----------



## kinglui (24. Jan 2011)

Hallo,

Sorry. goLink ist eine Trinidad Komponente.. spielt aber eigentlich auch keine Rolle, das Problem ist ja das selbe. 

Bild in einer DB schreiben ginge theoretisch, wird aber afaik bei einer mysql DB nicht empfohlen, oder?

danke


----------



## maki (24. Jan 2011)

Auf jedenfall kannst du dich von der Idee verabschieden die Bilder direkt in den WebApp "Ordner" zu speichern, diesen muss es nämlich nicht geben, bestenfalls sind die Bilder bei einem re-deploy/update der WebApp oder Neustart des Servers weg.


----------



## kinglui (24. Jan 2011)

okay gut.
Danke für den Hinweis.

Bleibt also nur die DB Möglichkeit, oder seht ihr eine Alternative?
Könnte ich dem Server nicht z.B. Schreibrechte auf ein bestimmtes Verzeichnis außerhalb des Projekts geben (hat hier lokal bei meinen Tests nicht funktioniert)? 


Ciao


----------



## Stroker89 (26. Jan 2011)

Stehe Momentan vor einem ähnlichen Problem.

User Laden Avatare in ein bestimmtes Verzeichnes in der WebApp hoch: 

/avatars/profile

und 

/avatars/profile/cropped

das ganze wird dann in der Datenbank gespeichert ungefähr so:

../avatars/profile/beispiel.jpg

Somit ist das Bild in jeder JSP meiner WebApp verfügbar.

Nun stehe ich aber auch vor dem Problem, dass die Bilder ja jedes mal gelöscht werden, sobald die WebApp redeployed wird.

Wie kann man Abhilfe schaffen? Externer Odner? Wenn ja, sind die bilder dann auch mit dem absoluten Pfad der Bilder auf dem Server in JSP einbindbar? 
Zum Beispiel liegt Bild auf dem Server unter C:\avatars\profile\beispiel.jpg 
wenn ich diesen Pfad dann in einem <img> Tag einbinde, wird das Bild gefunden?

Gruß


----------



## maki (26. Jan 2011)

Eine DB verwenden wäre "sauber", ansonsten einen externen Ordner mit einem sog. "Stream Servlet", der Pfad zum externen Ordner könnte ja zB. als Servlet init parameter in der web.xml hinterlegt werden.


----------



## Stroker89 (26. Jan 2011)

Da ich Glassfish benutze könnte ich doch eigentlich für die Bilder den "docroot" Ordner missbrauchen oder? 

Gruß


----------



## maki (26. Jan 2011)

k.A., kenne GlassFish nicht wirklich 

Aber als AppServer sollte es einen JCA geben um auf das Dateisystem zuzugreifen, ist sauber im Sinne der EJB Spek.


----------

