# FTP mit Java



## langhaar (19. Feb 2005)

Hallo, bin neu hier!

Ich erzeuge mit einem JAVA Programm HTML und PHP Code und möchte den gerne per Programm hochladen.

Hab' allerdings keine Ahnung, wie ich das geschicktesten mache, oder überhaupt hinbekomme.

Mein bisheriger Ansatz (nur Test) sieht wie folgt aus:

URL url = new URL( "ftp://www.fakeadress.net/files"; ) ;
URLConnection con = url.openConnection();
OutputStream os = con.getOutputStream();
for (byte i = 0; i < 10; )
os.write(i);

Der Code bewirkt allerdings rein gar nichts...?


----------



## Bebbo Erbse (19. Feb 2005)

Ich kenne mich nicht vollkommen in der Netzwerkprogrammierung aus, aber ich habe mit einem Buch schonmal ein Programm wie du es wahrscheinlich brauchst geschrieben.
Als erstes musst du mit dem Server kommunizieren. Der Server hält für dich auf dem Port 21 ein bestimmtes Programm bereit, mit dem du kommunizieren kannst. Dem übergibst du Daten wie deinen Usernamen auf deinem Webserver, dein Passwort, usw.
Hier findest du diese Programm(genannt: Trivia.java(das unterste Programm)). Die Portnummer solltest du auf 21 umändern(FTP):
http://www.hadiko.de/mirrors/Java_1.2_in_21_Tagen/kap18.htm

Was die ganzen Funktionen machen und wie man sie benutzt, kannst du alles auf dieser Seite durchlesen.(beginne am besten oben)

Ich hoffe es hat dir etwas weitergeholfen.


----------



## langhaar (20. Feb 2005)

Hallo Bebbo!

Danke für die Antwort.
Leider sehe ich bislang noch nicht, wie mich das weiterbringt.
Das von dir verlinkte Programm erzeugt mit Sockets eine Client - Server Verbindung. Auf den Server habe ich keinen Einfluss.
Wenn ich nun den Client Teil nehme, und einfach Daten übertrage, bleibt die Frage, wie werden diese verarbeitet?
Wie gebe ich z.B. den Namen des anzulegenden Files an?
Das reine Übertragen von Daten sollte ja auch mit dem von mir bereits skizziertem Code im ersten Beitrag möglich sein (Die Rückrichtung funktioniert).
Vermutlich werden diese dann bloss nicht ensprechend verarbeitet? (Also kein File angelegt und gespeichert, sondern ignoriert)

Werde nachher mal mit dem von dir gezeigtem Code experimentieren, kann mir aber irgendwie nicht vorstellen, wie das funktionieren kann.


----------



## Illuvatar (20. Feb 2005)

Du kannst über HTTP, also so, wie du es da oben geschrieben hast, keine Datei auf dem Server anlegen. Dafür benötigst du FTP. Dabei sendet dein Client bestimmte Befehle an den FTP-Server, dieser erkennt die Befehle und speichert deine Datei an der richtigen Stelle. Wie so eine Sitzung aussieht, kann man sich bei vielen FTP-Programmen anzeigen lassen, das wäre zum Beispiel so etwas:


> SmartFTP v1.0.983.22
> Resolving host name es-wave.de...
> Connecting to (es-wave.de) ->  IP: 212.227.127.202 PORT: 21
> Connected to (es-wave.de) -> Time = 63ms
> ...



Die Befehle kannst du auch im RFC 959 nachlesen.

Das gibt es aber natürlich auch schon vorgefertigt. Ich habe dafür mal folgende Klasse geschrieben:

```
import sun.net.ftp.*;
import java.net.*;
import java.io.*;
import de.illu.util.*;

/**
 * Delegaten-Klasse für sun.net.ftp.FtpClient
 * @author Illuvatar
 */
public class FTPHandler 
{
	private FtpClient ftpc;
	public FTPHandler (InetAddress server, String username, String pass) throws IOException
	{
		ftpc = new FtpClient ();
		ftpc.openServer (server.getHostName());
		ftpc.login (username, pass);
	}
	/**
     * Wechselt das Verzeichnis
     */
    public void cd (String to) throws IOException
    {
    	ftpc.cd (to);
    }
    /**
     * Wechselt in den binary - mode.
     */
    public void binary() throws IOException
    {
    	ftpc.binary();
    }
    /**
     * Wechselt in den AscII - mode.
     */
    public void ascII() throws IOException
    {
    	ftpc.ascii();
    }
    /**
     * Führt das noop - Commando aus.
     */
    public void noop() throws IOException
    {
    	ftpc.noop();
    }
    /**
     * Lädt fil in eine neue Datei auf dem Server mit dem Namen name hoch.
     */
    public void upload(File fil, String name) throws IOException
    {
    	if (!fil.exists()){
    		throw new IllegalArgumentException ("The file doesn't exist");
    	}
    	OutputStream os = ftpc.put(name);
    	InputStream is = new FileInputStream (fil);
    	int len; byte[] buf = new byte[1024];
    	while ((len = is.read(buf)) >= 0){
    		os.write(buf, 0, len);
    	}
    	is.close();
    	os.close();
    }
    /**
     * Lädt die Datei auf dem Server mit dem Namen name in fil down.
     */
    public void download(File fil, String name) throws IOException
    {
    	OutputStream os = new FileOutputStream (fil, false);
    	InputStream is = ftpc.get(name);
    	int len; byte[] buf = new byte[1024];
    	while ((len = is.read(buf)) >= 0){
    		os.write(buf, 0, len);
    	}
    	is.close();
    	os.close();
    }
    /**
     * Beendet die Verbindung.
     */
    public void quit() throws IOException
    {
    	ftpc.closeServer();
    }
}
```

Das benützt allerdings eine Klasse aus sun.net, d.h. es ist nicht garantiert, dass diese Klasse auch in späteren JDK-Versionen bestehen bleibt.


----------



## Guest (20. Feb 2005)

Illuvatar hat gesagt.:
			
		

> Du kannst über HTTP, also so, wie du es da oben geschrieben hast, keine Datei auf dem Server anlegen. Dafür benötigst du FTP.



Wieso denn HTML? Ich hab' doch eine FTP Verbindung aufgebaut, indem ich als Protokoll FTP angegeben habe...



> Dabei sendet dein Client bestimmte Befehle an den FTP-Server, dieser erkennt die Befehle und speichert deine Datei an der richtigen Stelle.



Jetzt wird's wärmer!
Das hilft mir weiter und erklärt auch, warum ich den Mechanismus bislang nicht nachvollziehen konnte.
DANKE!!!


----------



## stev.glasow (21. Feb 2005)

Hi, von diesen selbst implemtierten Ftp-Clients würde ich abraten, und besonders von diesen URL basierten, da Sun dort nur den alten Standart implemtiert hat, was zu erheblichen Problemen führen kann (und auch wird).
Schau dir mal http://jakarta.apache.org/commons/net/ an.


----------



## langhaar (21. Feb 2005)

Illuvatars Code hat bei mir einwandfrei gearbeitet.
Fals jemand das gleiche Problem hat wie ich, ergänze ich mal, 
dass es auch wesentlich einfacher geht:


```
URL url = new URL( "ftp://user:pswd@www.rl.gfx-networks.net/files/text.xxx;type=i");
URLConnection con = url.openConnection();
OutputStream os = con.getOutputStream();
for (byte i = 0; i < 10;i++)
os.write(i);
		  	
os.close();
```

Somit fehlte in meiner ersten naiven Lösung nur die Angabe des Ausgabefiles in der Url!
(Ausserdem hatte ich das i++ vergessen)
Das type=i setzt den Übertragungsmodus auf binary.


----------



## stev.glasow (21. Feb 2005)

> FTP client support in JDK strictly follows the standard recommendation (RFC1738), but it has several downsides:
> 
> * It fundamentally differs from the third-party FTP client libraries; these implement RFC959 rather than RFC1738.
> 
> ...


Quelle: http://www.javaworld.com/javaworld/jw-04-2003/jw-0404-ftp.html

Hinzu kommt dass der FTP-Server auch gerne mal mit einer "unsupported standard" (oder so ähnlich) antworten, was wohl auf Punkt 4 zurück zu ziehen ist.
Aber wir wollen ja keinen zwingen :wink:  das sind nur gut gemeinte Ratschläge.


----------



## Illuvatar (21. Feb 2005)

langhaar hat gesagt.:
			
		

> Illuvatars Code hat bei mir einwandfrei gearbeitet.
> Fals jemand das gleiche Problem hat wie ich, ergänze ich mal,
> dass es auch wesentlich einfacher geht:
> 
> ...



Interessant, gut zu wissen


----------



## langhaar (21. Feb 2005)

@steveq

Hab' deinen vorherigen Beitrag erst nach meinen letzten Post gelesen, da wir quasi zeitgleich geschrieben haben.
Auf die apache Seite bin ich bei meinen Recherchen auch schon gestossen, wollte jedoch zunächst keine fremden Pakete benutzen, da ich von der Notwendigkeit nicht überzeugt war, ich mit fremden Paketen bislang noch nicht gearbeitet habe und doch sehr viel Overhead dabei ist.
Bin gerade dabei, mir die Sache anzuschauen.


----------



## millinär (12. Jul 2006)

sweet verry nice kurz und unkompliziert so liebe ich es
werden die daten angehängt oder wird vorher alles was in der datei ist Gelöscht?


----------

