Up- und Download mit https

T

Teferi

Gast
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:
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!
 
T

Teferi

Gast
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?
 
T

Teferi

Gast
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:

Code:
%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?
 
G

Gast2

Gast
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.
 
T

Teferi

Gast
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:
Java:
                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:
Java:
       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:
Code:
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?
 
T

Teferi

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

Da ist nur ein Folgefehler.

Da führe ich folgendes aus:
Code:
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.
 
T

Teferi

Gast
Zum Teil habe ich diese Sache gelöst.
Da ich von dem vorherigen Versuch noch diese Zeilen drin hatte
Java:
@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
HTML:
<a href="Beispiel.txt">Download</a>
versuche, Beispiel.txt runterzuladen, sagt der Browser folgendes:

Code:
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?
 
T

Teferi

Gast
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:
Java:
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.).
 
T

Teferi

Gast
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:
Java:
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:
Java:
	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.
 
T

Teferi

Gast
Ich habe jetzt auch den Download geknackt.

Mein Download-Servlet sieht so aus:
Java:
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:
Java:
	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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
J Datei Download vom Server Netzwerkprogrammierung 8
P Jenkins Login per Java Download Manager Netzwerkprogrammierung 15
T Download überprüfung... Netzwerkprogrammierung 9
S HTTP Download von Google-URL mit Parametern Netzwerkprogrammierung 1
S download PDF Netzwerkprogrammierung 2
V Datei Download Fenster Netzwerkprogrammierung 9
R Apache HttpClient File Download? Netzwerkprogrammierung 3
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
T Download Programm - Download endet vorzeitig (bricht ab) Netzwerkprogrammierung 11
D HTTP Download - Skript im Weg Netzwerkprogrammierung 4
C Fehler bei PDF-Download Netzwerkprogrammierung 5
B FTP *.class download Netzwerkprogrammierung 2
eLogic Download eines Links Netzwerkprogrammierung 2
Dit_ FTP Download | "PassiveMode"-Socket öffnen Netzwerkprogrammierung 4
B HTTP Audio-Download per Direktlink Netzwerkprogrammierung 4
eLogic Download aus Internet Netzwerkprogrammierung 18
M Download von Webseite Netzwerkprogrammierung 4
A RMI Fortschritt bei Up/Download anzeigen Netzwerkprogrammierung 6
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
B HTTP PDF Servlet download vom Server zum Client Netzwerkprogrammierung 3
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
Schandro Download von FTP Server mit maximal Geschwindigkeit Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
ModellbahnerTT Download progress Netzwerkprogrammierung 4
D FTP Download Netzwerkprogrammierung 5
N Video download Netzwerkprogrammierung 4
hdi Webseite auf Download-Links prüfen und Download starten? Netzwerkprogrammierung 7
C Download-Fortschritt wird falsch angezeigt. Netzwerkprogrammierung 2
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
B FTP - Verzeichnis Download Netzwerkprogrammierung 3
A Download-Client Netzwerkprogrammierung 6
A download programm Netzwerkprogrammierung 2
K http-download Netzwerkprogrammierung 12
2 Redirect, Login und Download bei Rapidshare.com Netzwerkprogrammierung 4
L file upload / download über http Netzwerkprogrammierung 5
M Download über URL Netzwerkprogrammierung 7
B knacken bei download von mp3 datei Netzwerkprogrammierung 2
N Download HTTP .php-Seite mit Anmeldung Netzwerkprogrammierung 5
I rmi und download von klassen Netzwerkprogrammierung 12
M Download-Manager in System/Browser einbinden Netzwerkprogrammierung 11
P Download funtioniert nicht richtig. Netzwerkprogrammierung 2
M FTP Verbindung und download von *.txt Netzwerkprogrammierung 6
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
G localhost im Backend https vs. http Netzwerkprogrammierung 9
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
N Hintergrundlogin HTTPs Webform Netzwerkprogrammierung 5
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben