JAVA

Datei-Upload via SFTP

2023-04-22 | credit Stockbym (stock.adode)

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. 

JSch besorgen

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>

JSch Übersicht

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: 

Java JSch

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.  

Implementierung

Erstellen wir zunächst eine eigene Klasse z.B. mit dem Namen SFTPUpload. Das Grundgerüst der Klasse sieht so aus: 

Grundgerüst der Klasse

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: 

verbindenUndChannelOeffnen()

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

upload()

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

Vollständiger Code

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();
}



}
Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen