Thema in Kurzform
In diesem Tutorial zeigen wir dir, wie du in Java Dateien auf einen Server uploaden kannst.
Alles, was du dazu brauchst ist ein Import der JSch-Bibliothek. JSch stellt Klassen zur Verfügung, die es dir ermöglichen, ein SSH2-Protokoll zu starten, das eine verschlüsselte Verbindung zum Server herstellt.
Um Datein mit Java auf einen Server hochzuladen, können wir Secure Shell (SSH 2) verwenden. Also das Protokoll, mit dem sich über eine verschlüsselte Verbindung über unsichere Netze auf einen Server zugreifen lässt. Die Kommunikation über SSH2 ist kryptographisch gesichert und bietet ein hohes Sicherheitsniveau durch die gegenseitige Authentifizierung der Partner.
Die Implementierung von SSH ist in Java durch die JSch-Library möglich.
JSch ist nicht Teil der Java-SE und muss daher in unser Projekt erst importiert werden.
Du kannst dir die jar-Datei direkt vom Entwickler besorgen (Download) und einfach in dein Java-Projekt einbinden:
IntelliJ: Klicke in der Seitenleiste links ein Java-Projekt an. Gehe anschließend im Programm-Menu auf file > project structure... > libraries. Klicke im Project Structure-Menu auf das + Zeichen und füge jetzt die externe Klassenbibliothek dem Projekt hinzu, indem du die jar-Datei auswählst.
Eclipse: Wähle in der Seitenleiste links ein Java-Projekt aus. Gehe im Programm-Menu oben auf File > Properties. Es erscheint das Menu für die Properties. Wähle darin Java Build Path > Libraries > Add External JARs... und füge die jar-Datei hinzu.
Alternativ lässt sich das JSch Library-Package auch über Maven importieren. Füge das JSch Maven Dependency einfach zu deiner pom.xml hinzu:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
In Java kann die Implementierung von SSH2 durch die JSch-Library („Java Secure Channel“) gelöst werden. Das Zusammenspiel der wichtigsten Klassen (JSch, Session, Channel) siehst du hier:
Diese Klasse Jsch dient als zentraler Ausgangspunkt für die Konfiguration. Sie liefert insbesondere die benötigte Session, die wir zum connecten zum Server brauchen und die dann auch schließlich einen Channel öffnet, um auf das Dateisystem remote zuzugreifen.
Um den Upload von Dateien komfortabler zu machen, casten wir später noch die Klasse Channel runter auf ChannelSftp - doch dazu gleich mehr.
Erstellen wir zunächst eine eigene Klasse z.B. mit dem Namen SFTPUpload. Das Grundgerüst der Klasse sieht so aus:
package p1;
import com.jcraft.jsch.*;
public class SFTPUpload {
JSch jsch = new JSch();
Session session;
ChannelSftp channelSftp;
public static void main(String[] args){
SFTPUpload x = new SFTPUpload();
}
public void verbindenUndChannelOeffnen(){
// erklären wir unten
}
public void upload(){
// erklären wir unten
}
}
Erklärung: Zuerst importieren wir die gesamte JSch-Bibliothek. Die Klasse SFTPUpload startet mit der Instanziierung der Klasse JSch und hält zwei weitere Instanzvariablen für kommende Objekte der Klassen Session und ChannelSftp bereit.
Sehen wir uns jetzt die beiden Methoden verbindenUndChannelOeffnen() und upload() in der Detail-Implementierung an:
public void verbindenUndChannelOeffnen(){
try {
session = jsch.getSession("username", "Host-URL", SSH-Port);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("ganz-geheimes-PW");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
System.out.println("SFTP Connection + Channel Erfolg!");
} catch (JSchException e) {
e.printStackTrace();
}
}
Mit der Methode getSession() erstellen wir ein Session-Objekt und weisen es der Referenz session zu. Als Argumente übergeben wir der Methode diejenigen Werte, dir wir für die Verbindung zum SSH-Server benötigen.
Mit setConfig() setzen wir die Konfiguration für das sog. StrictHostKeyChecking fest. Wir gehen auf den Wert no, da unsere SSH-Anfrage sonst abgewehrt werden würde, weil unsere Verbindung ja (noch) nicht in der Liste der bekannten Hosts eingetragen ist. Mit „no“ wird JSch automatisch einen neuen Host-Schlüssel zur Liste der bekannten Host-Keys hinzufügen. Sicherer ist aber natürlich das Argument "yes".
setPasswort() übermittelt dann noch das SFTP-Passwort und die Methode connect() verbindet mit dem Server, sofern alle Daten stimmen.
Im nächsten Schritt erstellen wir noch einen Client-Channel, um die Kommunikation mit dem SSH-Server herzustellen. Da die Klasse Channel aber keinen wirklich bequemen Weg bietet, Dateien hochzuladen, casten wir die Referenz channel daher runter auf den Typ ChannelSftp.
public void upload(){
String verzeichnis = "falconbyte";
try {
channelSftp.mkdir(verzeichnis);
} catch (SftpException e) {
System.out.println("Fehler oder Verzeichnis schon existent");
}
// Upload!
try {
channelSftp.put("testdatei.txt", verzeichnis);
} catch (SftpException e) {
e.printStackTrace();
}
session.disconnect();
channelSftp.disconnect();
}
Jetzt geht's endlich los! Mit der oben erstellten Referenz channelSftp können wir ganz einfach online Verzeichnisse erstellen und Dateien hochladen:
So steht uns etwa die Methode mkdir() für das Erstellen von Verzeichnissen auf dem Server zur Verfügung. Aber Achtung: Wenn das genannte Verzeichnis schon exisitiert, wird eine Exception geworfen.
Super einfach ist dann auch der Upload von Dateien selbst: Wende die Methode put() einfach auf der channelSftp-Referenz an und fertig. put() funktioniert dabei mit der overwrite-Methode, überschreibt also kurzerhand Dateien mit der gleichen Bezeichnung.
Vergiss nicht, am Ende noch Sesson und Channel zu disconnecten :-)
Falls du keine Zeit für lange Erklärungen hast und einfach nur den Code rausziehen willst - bitte sehr:
package p1;
import com.jcraft.jsch.*;
public class SFTPUpload {
JSch jsch = new JSch();
Session session;
ChannelSftp channelSftp;
public static void main(String[] args){
SFTPUpload x = new SFTPUpload();
x.verbindenUndChannelOeffnen();
x.upload();
}
public void verbindenUndChannelOeffnen(){
try {
session = jsch.getSession("u877331821", "home587878991.1and1-data.host", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("G2v6b988$");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
System.out.println("SFTP Connection + Channel Erfolg!");
} catch (JSchException e) {
e.printStackTrace();
}
}
public void upload(){
String verzeichnis = "falconbyte";
try {
channelSftp.mkdir(verzeichnis);
} catch (SftpException e) {
System.out.println("Fehler oder Verzeichnis schon existent");
}
// Upload!
try {
channelSftp.put("testdatei.txt", verzeichnis);
} catch (SftpException e) {
e.printStackTrace();
}
session.disconnect();
channelSftp.disconnect();
}
}
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]