Bild hochladen

PollerJava

Top Contributor
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?
 

PollerJava

Top Contributor
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/...)
 
Zuletzt bearbeitet:

PollerJava

Top Contributor
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
 
M

Marcinek

Gast
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

Top Contributor
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

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

Beispielcode (jsf):
Java:
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
Java:
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:
Java:
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

Mitglied
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

Mitglied
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

Bekanntes Mitglied
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

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.
 

Ähnliche Java Themen

Neue Themen


Oben