# Dateiupload- Servlet



## jessi1447 (24. Aug 2010)

Ich möchte Java einen Dateupload programmieren, jedoch bekomme ich nur den dateinamen überliefert und nich den Dateipfad, den ich benötige.

Der HTML code dazu sieht wie folgt aus:

```
<form action="http://localhost:8080/HelloWorldServlet/dateiServlet" enctype="multipart/form-data" method="get">
Dateipfad:<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Hochladen"/>
```

Per Java habe ich versucht es mit 
	
	
	
	





```
request.getParameter("dateiname")
```
abzufragen. 

Gibt es in Java etwas wie 
	
	
	
	





```
$_FILES['thefile']['tmp_name']
```
in PHP?

Oder Gibt es ne andere sinnvolle möglichkeit das Problem zu lösen?


----------



## maki (24. Aug 2010)

Wozu brauchst du denn den "Dateipfad"? Sowas gibt es doch nicht mehr auf dem Server...

Kennst du schon FileUpload - Home


----------



## ARadauer (24. Aug 2010)

FileUpload - Home


----------



## XHelp (24. Aug 2010)

Also Dateien solltest du wohl mit POST übertragen.
Außerdem wäre MultipartRequest ein gutes Stichwort. Ich denke mal, dass du bei einer google Suche von "jsp upload" genügend Beispiele finden wirst.


----------



## jessi1447 (24. Aug 2010)

maki hat gesagt.:


> Wozu brauchst du denn den "Dateipfad"? Sowas gibt es doch nicht mehr auf dem Server...



Um die Datei zu kopieren.
FileUpload - Home

Hat nicht wirklich funktioniert


Ja nur ist das Problem das ist per POST nur "NULL" übergeben bekomme


----------



## XHelp (24. Aug 2010)

Naja, bei den Formularen überträgst du ja nicht Dateipfade, sondern Daten. Also brauchst du die Datei nicht kopieren, sondern aus dem Request nur auslesen



> Ja nur ist das Problem das ist per POST nur "NULL" übergeben bekomme


Dennoch... Binärdaten wirst du ohne weiteres mit GET nicht übertragen können.


----------



## jessi1447 (24. Aug 2010)

XHelp hat gesagt.:


> Dennoch... Binärdaten wirst du ohne weiteres mit GET nicht übertragen können.



Ja dessen bin ich mir bewusst, nur weist ich nicht, weswegen ich per POST nur "null" zurück bekomme


----------



## maki (24. Aug 2010)

jessi1447, 

entweder dir fehlen die Grundlagen, oder wir reden aneinander vorbei.

Was hat denn "nicht funktioniert" beim Commons FileUpload?


----------



## XHelp (24. Aug 2010)

jessi1447 hat gesagt.:


> Ja dessen bin ich mir bewusst, nur weist ich nicht, weswegen ich per POST nur "null" zurück bekomme



Gibt es hier: Let me google that for you kein einziges Beispiel, welches Funktioniert? Selbst hier im Forum müsste sich das eine oder andere finden.


----------



## jessi1447 (24. Aug 2010)

Was Servlets angeht, fehlt mir definitiv die Erfahrung.

Ich habe mich mit folgendem Beispiel befasst


```
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
 
public class CommonsFileUploadServlet extends HttpServlet {
	private static final String TMP_DIR_PATH = "c:\\tmp";
	private File tmpDir;
	private static final String DESTINATION_DIR_PATH ="/files";
	private File destinationDir;
 
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		tmpDir = new File(TMP_DIR_PATH);
		if(!tmpDir.isDirectory()) {
			throw new ServletException(TMP_DIR_PATH + " is not a directory");
		}
		String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
		destinationDir = new File(realPath);
		if(!destinationDir.isDirectory()) {
			throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
		}
 
	}
 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    PrintWriter out = response.getWriter();
	    response.setContentType("text/plain");
	    out.println("<h1>Servlet File Upload Example using Commons File Upload</h1>");
	    out.println();
 
		DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
		/*
		 *Set the size threshold, above which content will be stored on disk.
		 */
		fileItemFactory.setSizeThreshold(1*1024*1024); //1 MB
		/*
		 * Set the temporary directory to store the uploaded files of size above threshold.
		 */
		fileItemFactory.setRepository(tmpDir);
 
		ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
		try {
			/*
			 * Parse the request
			 */
			List items = uploadHandler.parseRequest(request);
			Iterator itr = items.iterator();
			while(itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				/*
				 * Handle Form Fields.
				 */
				if(item.isFormField()) {
					out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
				} else {
					//Handle Uploaded files.
					out.println("Field Name = "+item.getFieldName()+
						", File Name = "+item.getName()+
						", Content type = "+item.getContentType()+
						", File Size = "+item.getSize());
					/*
					 * Write file to the ultimate location.
					 */
					File file = new File(destinationDir,item.getName());
					item.write(file);
				}
				out.close();
			}
		}catch(FileUploadException ex) {
			log("Error encountered while parsing the request",ex);
		} catch(Exception ex) {
			log("Error encountered while uploading file",ex);
		}
 
	}
 
}
```

1. muss man da ja auch die Pfade angeben und 2. habe ich immer die ServletException bekommen


----------



## jessi1447 (24. Aug 2010)

Aber meine Frage ob es in JAVA etwas simples wie $_FILES['thefile']['tmp_name'] gibt wäre dann mit Nein beantwortet oder?


----------



## XHelp (24. Aug 2010)

jessi1447 hat gesagt.:


> 2. habe ich immer die ServletException bekommen


Die VM hat dir das wörtlich geschrieben: "Irgendwo ist ServletException geflogen, aber mehr weiß ich auch nicht"?



jessi1447 hat gesagt.:


> Aber meine Frage ob es in JAVA etwas simples wie $_FILES['thefile']['tmp_name'] gibt wäre dann mit Nein beantwortet oder?



Nein, das wirst du, imho, mit Standartmitteln nicht machen können.


----------



## jessi1447 (24. Aug 2010)

Nein ^^ So hat sie das nicht gesagt 


```
if(!destinationDir.isDirectory()) {
			throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
}
```

Wird die Fehler meldung geschmissen


----------



## maki (24. Aug 2010)

> 1. muss man da ja auch die Pfade angeben und 2. habe ich immer die ServletException bekommen


1. Nein
2. Dann hast du wohl einen Fehler



> Aber meine Frage ob es in JAVA etwas simples wie $_FILES['thefile']['tmp_name'] gibt wäre dann mit Nein beantwortet oder?


Doch, Commons FileUpload eben.

Interessant wäre der Stacktrace der Exception.


----------



## ARadauer (24. Aug 2010)

jessi1447 hat gesagt.:


> Aber meine Frage ob es in JAVA etwas simples wie $_FILES['thefile']['tmp_name'] gibt wäre dann mit Nein beantwortet oder?



leider nein, dafür wird aber auch nicht jedes cms und forum gehackt...


----------

