# Up- und Download mit https



## Teferi (18. Nov 2010)

Hallo!

Ich bin nicht sonderbar erfahren, was https und überhaupt Up- und Download angeht.

Meine Aufgabe ist jetzt, einen Upload über https und einen Download von dieser Datei zu programmieren. Dabei will ich mit dem MVC-System beigehen. (Servlet, JSP, Java-Klasse)
Für den Upload wird aus einer JSP die hochzuladende Datei, sowie ein/zwei Strings übergeben. Dateiname und Strings werden in einer Datenbank abgelegt.
Weil das Formular aus besagtem JSP den Enctype multipart/form-data und die Methode Post haben muss, benutze ich eine Kombination aus MultipartFilter, -Request und -Map. Dadurch wird aber die Datei lokal auf meinen Rechner gesandt. Beim Download wird aber bei einer Web-Seite gesucht. Nun hatte ich vor, zusätzlich einen Upload auf den Server zu machen, wobei ich nicht so recht weiß, ob das sinnvoll ist. (Ich sehe aber keine Alternative zu genannter Kombination.)
Da der Upload aber über https ablaufen soll, so habe ich erfahren, muss ich ein Zertifikat einrichten.

Ich habe schon einige Tage über Google nach einer Lösung gesucht, aber nicht wirklich etwas brauchbares gefunden.

Meine Fragen sind jetzt:
- Wie richte ich am einfachsten so ein Zertifikat ein? (kostenlos)
- Muss das Zertifikat im Java-Code enthalten sein? Und wenn ja, wie?
- Gibt es eine sinnvolle Alternative zu der Kombination MultipartFilter, -Request, -Map?
- Wie kann ich den Upload am einfachsten in meinen Code einbauen, damit er über https läuft und ich im Download die Dateien auch finde?

Das JSP-Formular:
[JAVA=78]
<form action="Up.do" method="post" enctype="multipart/form-data" name="uploadFormular">
			<table>
				<tr>
					<td>Wie ist Ihr Name? (optional)</td>
					<td><input name="person" type="text"></td>
				</tr>
				<tr>
					<td>Welches ist Ihre Firma?</td>
					<td><input name="firma" type="text"></td>
				</tr>
				<tr>
					<td>Welche Datei wollen Sie hochladen?</td>
					<td><input name="datei" type="file"></td>
				</tr>
				<tr>
					<td colspan="2"><center><input type="submit" value="Upload" name="hochladen"></center></td>
				</tr>
			</table>
		</form>
[/code]

Das Servlet Upload.java:

```
package serv;

import java.io.*;

import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

import serv.MultipartMap;

@WebServlet(urlPatterns = {"/upload"})
@MultipartConfig(location = "c://upload/", maxFileSize = 10485760L)
public class Upload extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MultipartMap map = new MultipartMap(request, this);
		String person = map.getParameter("person");
		String firma = map.getParameter("firma");
		File datei = map.getFile("datei");
		String dateiName = datei.getName();
		
		Hoch hoch = new Hoch(person, firma, dateiName);
		hoch.upload(datei);            //Noch nicht wirklich einsatzbereit.
		hoch.datenbank();             //Befüllen der Datenbank.
		FileFinder.haupt();             //Temporäre und überschüssige Dateien löschen.
		request.getRequestDispatcher("/erfolg.jsp").forward(request, response);
	}
}
```

Vielen Dank im Voraus für die Mühe!


----------



## Teferi (19. Nov 2010)

Ich vergaß zu erwähnen:

Ich nutze Tomcat 7, Eclipse in Windows.


----------



## DerEisteeTrinker (19. Nov 2010)

Für den Upload würde ich FileUpload von Apache nehmen und den Download einfach über ein Servlet realisieren


----------



## Teferi (19. Nov 2010)

An der Zertifikat-Front hat sich jetzt folgendes getan:

Ich habe mit

%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA

einen Key erstellt und mit

keytool -selfcert -v -alias tomcat -storepass changeit

ein selbstsigniertes Zertifikat erstellt.

Danach habe ich in der server.xml folgende Zeilen geändert:

[XML]<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="want" sslProtocol="TLS" 
               keystoreFile="${user.home}/.keystore" keystorePass="changeit"/>[/XML]

Nun ist da aber dieses Problem:

https://localhost:443/

Ich gebe dies im Browser ein. Der lädt ohne Ende. Er gibt weder eine Fehlermeldung aus noch sonstwas. Auch kein anderes Ergebnis.

Was mache ich falsch? Bzw.: Habe ich was vergessen?


----------



## Teferi (19. Nov 2010)

DerEisteeTrinker hat gesagt.:


> Für den Upload würde ich FileUpload von Apache nehmen


Darin muss ich doch irgendwie erwähnen, dass der Upload über https laufen soll. Oder irre ich mich da? Http ist da weniger ein Problem.


----------



## Teferi (22. Nov 2010)

Ich habe es jetzt geschafft, dass auf meine Seite mit https zugegriffen wird.

Ich habe einen neuen Keystore erzeugt. Dabei konnte ich ihn dadurch direkt auf C:\ legen:


```
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA -keystore \path\to\my\keystore
```

Mit diesem Keystore habe ich auch gleichzeitig ein selbstsigniertes Zertifikat erstellt.

Sodann habe ich meine server.xml geändert. Sie lautet jetzt:

[xml]
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="443"
			 maxHttpHeaderSize="8192" SSLEnabled="true"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" disableUploadTimeout="true"
              acceptCount="100" scheme="https" secure="true"
              clientAuth="false" sslProtocol="TLS" useBodyEncodingForURI="true"
              keystoreFile="C:\.keystore" keystorePass="changeit"/>
[/xml]

Wenn die Seite über https läuft, läuft eigentlich auch der Upload über https ab?


----------



## Gast2 (22. Nov 2010)

Ja, wenn du auf den von dir konfigurierten Connector verbindest läuft das über SSL. Upload oder Downlaod ist da ersteinmal egal - es wird ja in jedem Fall erstmal eine HTTP(S) Connection aufgebaut.


----------



## Teferi (23. Nov 2010)

DerEisteeTrinker hat gesagt.:


> Für den Upload würde ich FileUpload von Apache nehmen



Ich habe versucht, ihn zu benutzen. Allerdings gibt es da irgendwie ein Problem.

So sieht jetzt mein Servlet aus:

```
String person = null, firma = null, dateiName = null, werOderWas = null;
		String[] zurueck = new String[2];
		Hoch hoch = new Hoch();
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		List<?> items = null;
		try {
			items = upload.parseRequest(request);
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		Iterator<?> iter = items.iterator();
		while (iter.hasNext()) {
			FileItem item = (FileItem) iter.next();
			
			if (item.isFormField()) {
				zurueck = hoch.processFormField(item);
			} else {
				zurueck = hoch.processUploadedFile(item);
			}
			if (zurueck[0].equalsIgnoreCase("person")) {
				person = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("firma")) {
				firma = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("datei")) {
				dateiName = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("werIstDa")) {
				werOderWas = zurueck[1];
			}
		}
		
		hoch.datenbank();
		FileFinder.haupt();
		Mailer.haupt(person, firma, dateiName);
		request.setAttribute("Methode", 3);
		request.setAttribute("Upload", werOderWas);
		request.getRequestDispatcher("/erfolg.jsp").forward(request, response);
```

Und die behandelten Methoden aus Hoch:

```
public String[] processFormField(FileItem item) {
		String[] zurueck = new String[2];
		zurueck[0] = item.getFieldName();
		zurueck[1] = item.getString();
		return zurueck;
	}

	public String[] processUploadedFile(FileItem item) {
		String[] zurueck = new String[2];
		zurueck[0] = item.getFieldName();
		zurueck[1] = item.getName();
		return zurueck;
	}
```

Der parseRequest scheint nicht zu funktionieren. items ist eine leere List, wodurch die Variablen nicht gefüllt werden. Bei dem forward gibt es außerdem eine NullPointerException:

```
23.11.2010 10:53:41 org.apache.catalina.core.ApplicationDispatcher invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
	at org.apache.jsp.erfolg_jsp._jspService(erfolg_jsp.java:179)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:674)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:462)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:401)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
	at serv.Upload.doPost(Upload.java:78)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at serv.MultipartFilter.doFilter(MultipartFilter.java:28)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
23.11.2010 10:53:41 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet [HochMitDir] in context with path [/UpDownLoad] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
	at org.apache.jsp.erfolg_jsp._jspService(erfolg_jsp.java:179)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:674)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:462)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:401)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
	at serv.Upload.doPost(Upload.java:78)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at serv.MultipartFilter.doFilter(MultipartFilter.java:28)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
```

Wo ist mein Fehler?


----------



## tuxedo (23. Nov 2010)

Teferi hat gesagt.:


> Wo ist mein Fehler?



Ich schätze mal in "erfolg_jsp.java" Zeile 179 ... ???:L


----------



## Teferi (23. Nov 2010)

tuxedo hat gesagt.:


> Ich schätze mal in "erfolg_jsp.java" Zeile 179 ... ???:L



Da ist nur ein Folgefehler.

Da führe ich folgendes aus:

```
if(request.getAttribute("Upload").equals("XXX")){...}
```

Und XXX ist der Inhalt von werOderWas. Da items aber eine leere List ist, geht es gar nicht in die while-Schleife rein und werOderWas wird nicht befüllt. Also vergleich er den Inhalt von "Upload" mit null. Daher wird die NullPointerException geworfen.


----------



## Teferi (24. Nov 2010)

Zum Teil habe ich diese Sache gelöst.
Da ich von dem vorherigen Versuch noch diese Zeilen drin hatte

```
@WebServlet(urlPatterns = {"/upload"})
@MultipartConfig(location = "c://upload/", maxFileSize = 10485760L)
```
wurde der Request schon geparst oder verarbeitet. Deshalb hat mein parseRequest() eine leere List ausgegeben.
Außerdem hatte ich die commons-io.jar nicht importiert.

Die Zeilen habe ich auskommentiert und den Import nachgeholt.

So kommen die Daten zumindest in der Datenbank an. Wahrscheinlich hat auch der Upload geklappt.

Wenn ich allerdings versuche, mittels

```
<a href="Beispiel.txt">Download</a>
```
versuche, Beispiel.txt runterzuladen, sagt der Browser folgendes:


```
HTTP Status 404 - /UpDownLoad/Beispiel.txt
type Status report
message /UpDownLoad/Beispiel.txt
description The requested resource (/UpDownLoad/Beispiel.txt) is not available.
Apache Tomcat/7.0.2
```

Habe ich da was übersehen?


----------



## Teferi (24. Nov 2010)

Damit man weiß, wo man beim Download nach der Datei suchen will, muss man den Speicherort ja angeben.
Allerdings sollte die Datei im Netz gespeichert sein.

So sieht jetzt mein Servlet aus:

```
package serv;

import java.io.*;
import java.util.Iterator;
import java.util.List;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Upload extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String person = null, firma = null, dateiName = null, werOderWas = null;
		String[] zurueck = new String[2];
		Hoch hoch = new Hoch();
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		List<?> items = null;
		try {
			items = upload.parseRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Iterator<?> iter = items.iterator();
		while (iter.hasNext()) {
			FileItem item = (FileItem) iter.next();
			
			if (item.isFormField()) {
				zurueck = hoch.processFormField(item);
			} else {
				zurueck = hoch.processUploadedFile(item);
			}
			if (zurueck[0].equalsIgnoreCase("person")) {
				person = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("firma")) {
				firma = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("datei")) {
				dateiName = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("werIstDa")) {
				werOderWas = zurueck[1];
			}
		}
		
		hoch.datenbank(person, firma, dateiName);
		Mailer.haupt(person, firma, dateiName);
		request.setAttribute("Methode", 3);
		request.setAttribute("Upload", werOderWas);
		request.getRequestDispatcher("/erfolg.jsp").forward(request, response);
	}

}
```

Wo gebe ich denn jetzt den Speicherort an? Ich habe schon versucht, bei setRepository() einen File anzugeben, der auf einer URI beruht. Allerdings kam der Fehler, dass der Ort nicht gefunden werden konnte (Wahrscheinlich zum Lesen.).


----------



## Teferi (29. Nov 2010)

Ich denke, ich habe den Upload geknackt.

Ich habe nämlich herausgefunden, dass alle Dateien in file:///und-der-Pfad enthalten sind. Damit ich später zugreifen kann, sorge ich dafür, dass die hochgeladenen Dateien in einem definierten Ordner liegen, nämlich in file:///c:/upload/.

So sieht jetzt mein Servlet aus:

```
package serv;

import java.io.*;
import java.util.Iterator;
import java.util.List;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Upload extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String person = null, firma = null, dateiName = null, werOderWas = null;
		String[] zurueck = new String[2];
		Hoch hoch = new Hoch();
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(0);                       //Damit auf alle Fälle eine .tmp-Datei entsteht.
		File file = new File("c:/upload/");                  //Dort soll die .tmp-Datei hin.
		factory.setRepository(file);
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(10485760);   		     //10 MB ist die maximale Größe eines Uploads.
		List<?> items = null;
		try {
			items = upload.parseRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Iterator<?> iter = items.iterator();
		while (iter.hasNext()) {
			FileItem item = (FileItem) iter.next();
			
			if (item.isFormField()) {
				zurueck = hoch.processFormField(item);
			} else {
				zurueck = hoch.processUploadedFile(item);
			}
			if (zurueck[0].equalsIgnoreCase("person")) {
				person = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("firma")) {
				firma = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("datei")) {
				dateiName = zurueck[1];
			} else if (zurueck[0].equalsIgnoreCase("werIstDa")) {
				werOderWas = zurueck[1];
			}
		}
		File gross = hoch.finden("c:/upload/");        //Unter den temporären Dateien wird die größte, die eigentliche Datei, in 
                                                                           //Erfahrung zu bringen.
		dateiName = hoch.einzig(dateiName);         //Damit die Datei einzigartig bleibt, wird beim Namen ein Zeitstempel 
                                                                           //angefügt.
		hoch.rename(gross, dateiName);               //Aus der .tmp-Datei wird eine vom eigentlichen Typ.
		hoch.loeschen("c:/upload/");                    //Sämtliche .tmp-Dateien werden gelöscht.
		hoch.datenbank(person, firma, dateiName);
		Mailer.haupt(person, firma, dateiName);
		request.setAttribute("Methode", 3);
		request.setAttribute("Upload", werOderWas);
		request.getRequestDispatcher("/erfolg.jsp").forward(request, response);
	}

}
```

Und die entsprechenden Methoden in Hoch:

```
public File finden(String pfad) {
		ArrayList<File> dateien = new ArrayList<File>();
		dateien = this.suchen(pfad);
		File gross = this.maximum(dateien);
		return gross;
	}

	private ArrayList<File> suchen(String pfad) {
		ArrayList<File> dateien = new ArrayList<File>();
		Stack<File> dirs = new Stack<File>();
		File startDir = new File(pfad);
		dirs.push(startDir);
		for (File file : dirs.pop().listFiles()) {
			if (passt(file.getName(), ".tmp")) {
				dateien.add(file);
			}
		}
		return dateien;
	}

	private File maximum(ArrayList<File> dateien) {
		long size1, size2, endSize;
		while (dateien.size() > 1) {
			size1 = dateien.get(0).length();
			size2 = dateien.get(1).length();
			endSize = Math.max(size1, size2);
			if (endSize == size1) {
				dateien.remove(1);
			} else {
				dateien.remove(0);
			}
		}
		return dateien.get(0);
	}

	private boolean passt(String name, String endung) {
		if (name.length() >= endung.length() &&
				name.substring(name.length() - endung.length(), name.length()).equalsIgnoreCase(endung)) {
			return true;
		}
		return false;
	}

	public void rename(File gross, String dateiName) {
		File neu = new File("c:/upload/" + dateiName);
		gross.renameTo(neu);
	}

	public void loeschen(String pfad) {
		ArrayList<File> dateien = new ArrayList<File>();
		dateien = this.suchen(pfad);
		for (int i = 0; i < dateien.size(); i++) {
			dateien.get(i).delete();
		}
	}

	public String einzig(String dateiName) {
		String anfang = dateiName.substring(0, dateiName.lastIndexOf('.'));
		String endung = dateiName.substring(dateiName.lastIndexOf('.'));
		Date date = new Date();
		return anfang + date.getTime() + endung;
	}
```

Jetzt muss ich nur noch den Download zum funktionieren bringen.


----------



## DerEisteeTrinker (29. Nov 2010)

Teferi hat gesagt.:


> Darin muss ich doch irgendwie erwähnen, dass der Upload über https laufen soll. Oder irre ich mich da? Http ist da weniger ein Problem.



Nein musst du nicht, weil der Server das für dich schon umsetzen sollte. Ich arbeite nur mit https-Verbindungen und da brauch ich nichts einstellen oder angeben. Tippern und ab die Post


----------



## Teferi (30. Nov 2010)

Ich habe jetzt auch den Download geknackt.

Mein Download-Servlet sieht so aus:

```
package serv;

import java.io.File;
import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Download extends HttpServlet {
       
    public Download() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String was = request.getParameter("was");
		String wer = request.getParameter("wer");
		String werOderWas = request.getParameter("werIstDa");
		Runter runter = new Runter(wer);
		if(was.equalsIgnoreCase("Loeschen")){
			runter.loeschen();
		}else {
			File file = runter.getFileToDownload();                   //Von hier ...
			runter.prepareResponseFor(response, file);
			runter.streamFileTo(response, file);                      //... bis hier Methodenaufrufe für den eigentlichen Download.
		}
		
		RequestDispatcher rd;
		if (was.equalsIgnoreCase("Download")) {
			request.setAttribute("Methode", 1);
		} else {
			request.setAttribute("Methode", 2);
		}
		request.setAttribute("Upload", werOderWas);
		rd = request.getRequestDispatcher("/erfolg.jsp");
		try{
			rd.forward(request, response);
		}catch (IllegalStateException e) {
		}
	}
}
```

Hier die zum Download nötigen Methoden aus Runter:

```
public File getFileToDownload() {
		String anweisung = "SELECT Dateiname FROM daten WHERE Dateinummer = " + this.ort;
		Datenbank abfrage = new Datenbank(anweisung, true);
		this.setName(abfrage.vor("e", true));
		URI uri = null;
		try {
			uri = new URI("file", null, "///c:/upload/" + this.getName(), null);
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		return new File(uri);
	}

	public void prepareResponseFor(HttpServletResponse response, File file) {
		StringBuilder type = new StringBuilder("attachment; filename=");
		type.append(file.getName());
		response.setContentLength((int) file.length());
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", type.toString());
	}

	public void streamFileTo(HttpServletResponse response, File file) throws 
	IOException, FileNotFoundException {
		OutputStream os = response.getOutputStream();
		FileInputStream fis = new FileInputStream(file);
		byte[] buffer = new byte[BUFFER_SIZE];
		int bytesRead = 0;
		while ((bytesRead = fis.read(buffer)) > 0) {
			os.write(buffer, 0, bytesRead);
		}
		os.flush();
		os.close();
		fis.close();
	}
```

Damit ist mein Problem erledigt. Danke für eure Geduld.


----------

