jsch direktes streamen in ein image

Joob

Top Contributor
Mein alter Code, dabei konnte ich direkt auf die url zugreifen.

Code:
                    imagefile = new Image(graffilepath);
                    logojoso.setImage(imagefile);

Jetzt habe ich keinen direkten Zugriff mehr auf die URL und habe gedacht der richtige Weg wäre es wenn ich mit jsch direkt in das image streame.
Ich habe eine Klasse in der ich alle up und downloads habe.
Bis dato war da nur ein download in ein File notwendig.

In der neuen Situation wäre es aber notwendig eine Methode zu schreiben die den Stream ausgibt.

Geht das überhaupt ?
Wie kann ich die oben beschriebenen Funktionalität so umbauen das ich jsch mit FTP User und Password verwendet.

Alternativ
Ich schreibe eine Methode in der ein Image geladen wird und dieses von der Methode ausgegeben wird.
Da ich aber unterschiedliche Filetypen habe: Images, mp3 usw. müsste ich für jeden Typ eine Methode schreiben.
Oder geht das auch allgemeiner ?

Also anstatt
public image Methodennamen

public stream Methodennamen

Oder fasse ich das alles ganz falsch an.
Auf jeden Fall würde ich es gerne vermeiden immer wieder Files auf den ClientPC zu laden.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich habe auch nach dem dritten Mal Lesen echt keine Ahnung was du erreichen willst...

Du bekommst von irgendwo "irgendetwas", und willst das "irgendwie" ausgeben?

Und das "irgendetwas" ist keine URL und kein Stream, sondern irgendwas anderes?
Und das "irgendwie" soll keine Datei sein?
 

mihe7

Top Contributor
Ach, JSch - sorry, mein Hirn ist ein Sieb.

Ich glaube er will etwas wie
Java:
public interface Storage {
    InputStream getFile(String path);
}
Dann will er in seinem jetzigen Code die URL durch einen Pfad und ein Objekt mit Storage-Schnittstelle ersetzen (die JSch-basierte Implementierung muss er halt noch schreiben) und den InputStream an den Konstruktor der Image-Klasse (wo auch immer die herkommt...) übergeben:
Java:
logojoso.setImage(storage.getFile(imagePath));
 

Joob

Top Contributor
Ja denke das ist es.
Ich kann das nicht so gut beschreiben wie Ihr.

Ich hab mal eine einfache Methode geschrieben, aber da muss ich immer noch genau den Filetyp angeben.
Das würde mir aber schon einmal den Download in ein File ersparen:

Code:
    public Image getimage(String imageurl ) throws IOException  {
        
        Image thisimage = null;
        try {
            connectsftp(null);
            
            thisimage = new Image( channel.get(imageurl));
      
        
        } catch( SftpException ex ) {
            throw new IOException( ex );
        }
        
        return thisimage;
    }


und dann
Code:
imagefile = sftp.getimage(graffilepath);
                    youschoolgraf.setImage(imagefile);

eigentlich find ich das schon ganz brauchbar, da habe keine Files downgeloaded.

Aber richtig gut wäre es wenn ich so was allgemeiner hinbekommen würde.
Grundsätzlich geht ja alles mit channel.get(immageurl) nur würde ich die ganze Funktionalität auch gerne in der Klasse belassen in der ich auch für den Connect sorge.
 

mihe7

Top Contributor
Aber richtig gut wäre es wenn ich so was allgemeiner hinbekommen würde.
Das funktioniert eben mit Interfaces. Ich nehme mal Deine Methoden-Signatur an:
Java:
public interface ImageStore {
    Image getImage(String url) throws IOException; // die Exception könnte man auch weglassen
}

Wenn jetzt die Klasse von Dir oben dieses Interface implementiert, dann braucht der nutzende Code nur das ImageStore-Interface zu kennen. Er muss nicht wissen, wie das Objekt, das die Schnittstelle anbietet, implementiert oder erzeugt wurde.
 

Joob

Top Contributor
Ich hatte auch schon überlegt den Channel aus der Methode zu geben.
Aber dann weiß ich nicht wie den Channel wieder schließe kann.


Das fehlt auch noch in der Methode oben, ich probier gerade aus.
 

mihe7

Top Contributor
Je nachdem, wie groß die Bilder sind, kannst Du sie natürlich auch in einem byte-Array puffern. Dann gibst Du halt ein ByteArrayInputStream-Objekt zurück.
 

Joob

Top Contributor
Erst mal schönen Dank.

Dann müsste ich aber im Interface die verschiedenen Dateitypen implementieren. Oder

Aber das mit ByteArrayInputStream scheint mir das zu sein was ich erreichen möchte.
Stellt sich nur die Frage kann ich das Objekt dann in ein Image oder anderes speichern.
Das stellt doch nur eine Folge von Bytes dar, welche die Datei ist.
Wenn ich dann ein mp3 downgeloaded habe und im Objekt gespeichert habe, müsste ich mal sehen ob ich new Media(Objekt) zurecht komme.

Das muss ich mir morgen mal anschauen.
 

Joob

Top Contributor
Also das war leider nix.
Media in javafx ist sehr eingeschränkt welche Art von Parametern es akzeptiert.

Ich musste aufgeben und dort die Datei herunterladen.

Dann spielte fx die mp3 nicht komplett.
Habe alles mögliche ausprobiert. Diverse Threads in Google.
Nichts hat hingehauen.

Ich konvertier nun erst in wav und dann gehts ganz ordentlich.
 

Ähnliche Java Themen

Neue Themen


Oben