# File upload mit jsp (frage zum speicherort)



## .exe (21. Okt 2008)

Hi,

also ich habe versucht ein eine jsp.datei zu erstellen welche in der lage ist daten an meinem server hochzuladen.
Naja ich habe mal meine dicken java / jsp  wälzer ausgepackt und gesucht. Bin auch fündig geworden. Es läuft aber die datei wird immer im Startup folder des Servers (in meinem fall ein Tomcat) gespeichert. Ich weiss aber nicht wie ich das ändern kann.

Also meine Frage: Wie kann ich den speicherpfad ändern?



index.jsp


```
<form action="upload.jsp" method="POST" enctype="multipart/form-data">

<input type="file" name="theFile">


<input type="submit">
</form>
```


upload.jsp

```
<%@ page import="java.io.*" %>

<%
String contentType = request.getContentType();
System.out.println("Content type is :: " +contentType);
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
DataInputStream in = new DataInputStream(request.getInputStream());
int formDataLength = request.getContentLength();

byte dataBytes[] = new byte[formDataLength];
int byteRead = 0;
int totalBytesRead = 0;
while (totalBytesRead < formDataLength) {
byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
totalBytesRead += byteRead;
}

String file = new String(dataBytes);
String saveFile = file.substring(file.indexOf("filename=\"") + 10);
saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1,saveFile.indexOf("\""));

//out.print(dataBytes);

int lastIndex = contentType.lastIndexOf("=");
String boundary = contentType.substring(lastIndex + 1,contentType.length());

//out.println(boundary);

int pos;
pos = file.indexOf("filename=\"");

pos = file.indexOf("\n", pos) + 1;

pos = file.indexOf("\n", pos) + 1;

pos = file.indexOf("\n", pos) + 1;


int boundaryLocation = file.indexOf(boundary, pos) - 4;
int startPos = ((file.substring(0, pos)).getBytes()).length;
int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;

FileOutputStream fileOut = new FileOutputStream(saveFile);


//fileOut.write(dataBytes);
fileOut.write(dataBytes, startPos, (endPos - startPos));
fileOut.flush();
fileOut.close();

System.out.println(in);
System.out.println(boundaryLocation);

out.println("File saved as " +saveFile);

}
%>
```

mfg

.exe


----------



## maki (21. Okt 2008)

Steht dieser Pfusch (Skriplets) so in deinem Buch?

Wenn ja, schmeiss es weg 

Ansonsten wundere ich mich warum du kein Servlet  und nicht die commons fileupload verwendest.
Suche mal nach MVC bzw. "Model 2".


----------



## .exe (21. Okt 2008)

Ja der "pfusch" steht in meinem Bucht (ok es ist net das neuste).

Danke für den Tip mit Model 2 xD habe da schon was nettes gefunden.


----------



## maki (21. Okt 2008)

Konkret ist diese Zeile das "Problem":

FileOutputStream fileOut = new FileOutputStream(saveFile); 

Ersetze saveFile durch den Pfad + Dateinamen.

Und wirf dieses Buch weg *g*


----------



## .exe (21. Okt 2008)

ja aber wenn dann mach ich das jetzt richtig und net diesen "pfusch" ;-)


----------



## maki (21. Okt 2008)

Ein Servlet sollte die Datei speichern, nicht eine JSP.

JSPs sind rein für Darstellung verantwortlich, nicht für logik.

Mit der JSTL zB (eine Taglib) vermeidest du Scriptlets vollständig in JSPs.

Warum du selbst die Uploadfunktion implementierst ist auch so eine Sache, die commons fileupload lösen dieses Problem schon.


----------



## .exe (21. Okt 2008)

Habs hin bekommen xD


```
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

/** * Servlet implementation class for Servlet: UploadServlet *  */
public class UploadServlet extends javax.servlet.http.HttpServlet implements     
javax.servlet.Servlet 
{  
	private static final String UPLOAD_PAGE = "UPLOAD_PAGE";   
	 
	/*     * (non-Java-doc)     *      * @see javax.servlet.http.HttpServlet#HttpServlet()     */  
	public UploadServlet() 
	{    
		super();  
		}   
	/*     * (non-Java-doc)     *      * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,     *      HttpServletResponse response)     */ 
	protected void doPost(HttpServletRequest request,   
			HttpServletResponse response) throws ServletException, IOException 
			{       
		FileItemFactory fileItemFactory = new DiskFileItemFactory();   
		ServletFileUpload servletFileUpload = new ServletFileUpload(  
				fileItemFactory);    
		try 
		{    
			List items = servletFileUpload.parseRequest(request);  
			for (Iterator iterator = items.iterator(); iterator.hasNext();)
			{      
				FileItem fileItem = (FileItem) iterator.next();   
				try 
				{       
					String fileName = FilenameUtils.getName(fileItem.getName());  
					String uniqueFileName = generateFileUploadEntryInDatabase(fileName); 
					StringBuilder stringBuilder = new StringBuilder();  
					stringBuilder.append("Uploading: ");  
					System.out.println(stringBuilder); 
					stringBuilder.append(fileName);
					System.out.println(stringBuilder); 
                  stringBuilder.append(" to "); 
                  System.out.println(stringBuilder); 
            ; 
                  stringBuilder.append(new File("C:",uniqueFileName).getAbsolutePath());      
                  
                  System.out.println(stringBuilder); 
                  
                  fileItem.write(new File("C:", uniqueFileName));
                
                  } 
				catch (Exception e) 
				{             
					e.printStackTrace();  
					}      
				}   
			} 
		catch (FileUploadException e) 
		{  
			e.printStackTrace();  
			}       
		//request.getRequestDispatcher(getInitParameter(UPLOAD_PAGE)).forward(request, response);  
		}  
	private String generateFileUploadEntryInDatabase(String fileName)
	{      
		String uniqueName = fileName;  
		System.out.println("save in db... " + fileName + " -> " + uniqueName);   
		return uniqueName;  
		}
	}
```

es läuft


----------



## maki (21. Okt 2008)

Nebenbei, solltest den Pfad für die Dateien nicht hardocdieren sondern in der web.xml als Parameter übergeben.


----------



## .exe (21. Okt 2008)

auch das noch  XD

werde ich dann mal machen


----------



## Gast (5. Nov 2008)

Tja ich hab mal das selbe wie .exe probiert und sowas als JSP gemacht und mus feststellen das noch n weiteres Poblem hinzukommt.
bei größeren Dateien (so ab 10MB) haut er mir ne Fehlermeldung von wegen: 
java.lang.OutOfMemoryError: Java heap space

entgegen.
Is da irgendne beschrönkung der Dateigröße fest implementiert?

mfg Morros


----------



## .exe (6. Nov 2008)

Hi,
also bei mir geht das ohne probleme auch mit daten weit über 10MB (lasse zz daten im bereich 50 bis 80MB hochladen) und bis jetzt gab es da noch nie einen fehler.

aber schau mal hier ---> http://www.javazoom.net da gibt es ne nette hilfe für große daaten (bis zu 1TB ^^).

mfg

.exe


----------



## maki (6. Nov 2008)

> java.lang.OutOfMemoryError: Java heap space
> 
> entgegen.
> Is da irgendne beschrönkung der Dateigröße fest implementiert?


Du musst der VM mehr Speicher zuweisen.


----------



## Gast (10. Nov 2008)

Ich bins nochmal 
also das was .exe mir gegeben hat hat gefunzt.
is ne super sache werd das dann mal noch auf meinen FTP als Ziel umbauen.
thx a lot

mfg Morros


----------

