# Bild hochladen



## PollerJava (14. Aug 2011)

Hi,

ich will in meiner Java Spring Web Applikation eine Form anbieten, mit der man ein Bild hochladen kann. 
Dieses Bild sollte dann auch in einer JSP dargestellt werden können.
Mir ist jetzt nicht klar wie ich das programmieren kann, da meine Web App momentan unter localhost läuft und ich noch keinen WebSpace habe, wo ich das Bild hochlade und dann eine URL auf dieses Bild habe?


----------



## Marcinek (14. Aug 2011)

Let me google that for you


----------



## PollerJava (16. Aug 2011)

OK, ich hab mir das Beispiel durchgelesen (erster Link), was mir nicht ganz klar ist, ob das die (beste) Lösung ist, dass ich einfach die Files in einem Tomcat- Server- Ordner ablege.
Macht man das immer so? oder wie macht ihr das?
Also mir geht es um die Speicherung der Dateien, wo speichere ich die upgeloadeten Files am Server? 
Mach ich da einfach einen Ordner o.ä.?

Wenn ich den Pfad so wie hier angebe, bin ich ja voll von der Ordnerstruktur des Servers abhängig (Linux/Windows/MAC/...)


----------



## PollerJava (17. Aug 2011)

Da bin ich ja wieder da, dass ich aus einer WebApplikation, welche in Tomcat gehostet ist, auf eine Verzeichnisstruktur zugreifen muss und das sollte man ja vermeiden, oder?
Wie macht ihr das?
Poller


----------



## Marcinek (18. Aug 2011)

Wieso sollte man es vermeiden aus einem Tomcat auf der Festplatte zu lesen/schreiben?

Du musst natürlich mit relativen oder konfigurierbaren Verzeichnissen arbeiten, dann ist das BS auch egal.

Es gibt die Möglichkeit auch binärdaten in der DB abzulegen. Muss man von dem jeweiligen Projekt klären.


----------



## PollerJava (20. Aug 2011)

Kannst du da ein Beispiel geben wie ich den pfad da angeben kann. 
Es ist ja so, dass der Web-Browser des Clients einen Pfad auf meinem Server bracuht, da ja auf diesem Server das Bild gespeichert ist, oder?


----------



## nocturne (22. Aug 2011)

Wenn du ein geiler Hengst bist, kannst du das bild in der Datenbank speichern.

Beispielcode (jsf):

```
package org.enexus.releasemanagement.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.enexus.releasemanagement.Navigation;
import org.enexus.releasemanagement.entitybeans.DiaPicture;

/**
 * Servlet implementation class ImageServlet
 */
public class ImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * Recivies an image from database, depend on the DiaPictureID.
	 * 
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		ServletOutputStream os = response.getOutputStream();
		HttpSession session = request.getSession();

		if (request.getParameter("DiaPictureID") != null) {
			int diaId = Integer.parseInt(request.getParameter("DiaPictureID"));

			Navigation n;
			if (session == null)
				n = new Navigation();
			else {
				n = (Navigation) session.getAttribute("nav");
			}
			DiaPicture pic = (DiaPicture) n.getSession().get(DiaPicture.class,
					diaId);
			response.setContentType(pic.getMimeFiletype());
			os.write(pic.getByteData());
		} else
			os.write("Require DiaPictureID!".getBytes());

	}

}
```

Wobei die DB-Entity

```
package org.enexus.releasemanagement.entitybeans;
import java.io.Serializable;
/**
 * <hr/>
 * <b style=font-size:12pt>Resource</b>
 * <ul>
 *   <li>{@link #getMimeFiletype MimeFiletype} </li>
 *   <li>{@link #getByteData ByteData} </li>
 *   <li>{@link #getFilename Filename} </li>
 * </ul>
 */
@MappedSuperclass
@AccessType("property")
@SuppressWarnings({"unused", "serial"})
public class Resource extends Name implements Serializable{
	// class fields
 
	private String mime_filetype;
 
	private byte[] byte_data;
 
	private String filename;

	public Resource(){
		super();
		setValue(this);
	}
 
 

	@Length(min=3, max=24)
	/**  
	 */  
	@Column(name = "mime_filetype")
	public String getMimeFiletype() {return this.mime_filetype;};
	public void setMimeFiletype(String mime_filetype) {
		this.mime_filetype = mime_filetype;
	};
 
 

	@NotNull
	/**  
	 */  
	@Column(name = "byte_data")
	public byte[] getByteData() {return this.byte_data;};
	public void setByteData(byte[] byte_data) {
		this.byte_data = byte_data;
	};
 
 

	@Length(min=2, max=16384, message="{validator.pattern}")
	@NotNull(message="Ein Dateiname muss angegeben sein.")
	/**  
	 */  
	@Column(name = "filename")
	public String getFilename() {return this.filename;};
	public void setFilename(String filename) {
		this.filename = filename;
	};
}
```

und zum Hochladen:

```
public void executableUpload(UploadEvent ue) throws IOException {

		
		
		File file = ue.getUploadItem().getFile();
		String contentType = new MimetypesFileTypeMap().getContentType(file);
		DiaPicture dp = new  DiaPicture();
		dp.setMimeFiletype(contentType);
		dp.setFilename(ue.getUploadItem().getFileName());
		dp.setByteData(getBytesFromFile(file));
		
		org.hibernate.classic.Session session = navigation.getSession();
		Transaction beginTransaction = session.beginTransaction();
		session.save(dp);
		beginTransaction.commit();
		
	}
```
und der JSF-Teil:
[XML]<tr>
				<th>Datei</th>
				<td><rich:fileUpload ajaxSingle="true"
						fileUploadListener="#{projectBean.executableUpload}" id="fu">
						<a4j:support event="onuploadcomplete" ajaxSingle="true"
							reRender="mime,fn" />
					</rich:fileUpload>
				</td>
			</tr>[/XML]


----------



## Tatsu (22. Aug 2011)

Ich würde mir das genau überlegen, bevor ich größere Mengen an "Binärdaten" in einer Datenbank ablege.

Stichwort: Performance, Skalierung

Grüße

Bastian


----------



## Tatsu (22. Aug 2011)

Bei Application-Servern kannst Du auch externe Verzeichnisse mappen. Wie das bei Tomcat/Spring geht weiß ich nicht.

Ein Beispiel für Glassfish:

Datei: glassfish-web.xml:
[XML]
<property name="alternatedocroot_1" value="from=/upload/photos/* dir=/data/meineApp" />
[/XML]

URL: www.foo.de/upload/photos/bild1.jpg
zeigt dann auf
-> /data/meineApp/upload/photos/bild1.jpg

Hoffe das hilft weiter.

Bastian


----------



## nocturne (22. Aug 2011)

Tatsu hat gesagt.:


> Ich würde mir das genau überlegen, bevor ich größere Mengen an "Binärdaten" in einer Datenbank ablege.
> 
> Stichwort: Performance, Skalierung
> 
> ...



Performancetechnisch hast du vollkommen recht. 

Das skalieren wäre ja eine frage der Datenbank und/oder Datenbankkonfiguration. Dafür ist das Backup einfacher und es gibt, zumindest bei richtiger Konfiguration, bei doppelten Datensätzen keinen doppelten Speicherplatzverbrauch.


----------

