# Apache FTPClient upload



## Jukka (18. Apr 2009)

Hello World

Ich habe ein Problem mit meinem FTPClient. I benütze eine Erweiterung von org.apache.commons.net.ftp.FTPClient. Ich habe ein Ubuntu OS auch einer i386 architektur. I verbinde zu einem FTP Server, der soviel ich weiss, auch auf irgendeinem UNIX betrieben wird.

Ich kann Files vom Server "herunterladen", aber hochladen funktioniert nicht. Folgend einige Informationen, die ich mir auf die Konsole ausgaben liess:


> Reply String: 230 User web282f2 logged in
> 
> setFileType: true
> execute: screenShot
> ...



Danach bin ich per Debugger in den Apache-Quelltext und habe herausgefunden, dass auf folgender Zeile null zurückgegeben wird:

```
if (pasv() != FTPReply.ENTERING_PASSIVE_MODE)
                return null;
```
Diese Zeile ist: FTPClient.java:498


Folgend der ganze Quelltext:

*Achtung:*
Ich denke es ist logisch, dass ich nicht die Klasse selbst starte, sondern aus einer anderen heraus, wo ich zuerst ein objekt erstelle und dann *nur* die methode uploadImage() aufrufe.* Ich gebe Ihr als Parameter jedoch Dummy-Strings mit, weil sie sowieso nicht beachtet werden (zum test).*


```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.io.CopyStreamException;

public class FtpClient {

	private FTPClient client;

	public FtpClient(String host, String user, String password)
			throws IOException {
		client = new FTPClient();
		client.connect(host);
		client.login(user, password);
		System.out.println("Reply String: "+client.getReplyString());
		System.out.println("setFileType: "+client.setFileType(FTP.BINARY_FILE_TYPE));
		client.enterLocalPassiveMode();
	}

	public void uploadImage(String remote, String local) {
		try {
			System.out.println("Change w-Dir: "+client.changeWorkingDirectory("images"));
			File f = new File("/home/jukka/Desktop/help.png");
			InputStream input = new FileInputStream(f);
			boolean retValue = client.storeFile(f.getName(), input);
			input.close();
			System.out.println("status: "+client.getStatus());
			System.out.println("storeFile: "+retValue);
		} catch (FTPConnectionClosedException e){
			e.printStackTrace();
		}catch (CopyStreamException e){
			e.printStackTrace();
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void uploadFile(String remote, String local) throws IOException {
		InputStream input = new FileInputStream(local);
		client.storeFile("images/" + remote, input);
		input.close();
	}

	public boolean cd(String destination) throws IOException {
		return client.changeWorkingDirectory(destination);
	}

	public InputStream read(String filename) throws IOException {
		return client.retrieveFileStream(filename);
	}
}
```

Zögert nicht mich zu fragen, falls etwas nicht klar sein sollte.

es danke und grüsst
jukka


----------



## Imo (28. Mrz 2011)

Hallo,

ich habe einen FTP- Upload geschrieben, der nach dem gleichen prinziep läuft. Ich nutze es um PDF- Dateien auf einen Server zu laden.

Bei Upload selbst bringt er mir keine Fehler, aber wenn ich die Größe der Zieldatei mit der Quelldatei vergleiche, ist das Ziel immer Größer. bei meinem bsp ist die originalgröße 165.484 bytes und auf dem server ist die datei plötzlich 166.772 bytes groß.

woran kann das liegen?

fals quellcode gebraucht wird, kann ich den gerne nachreichen 

Danke
der Imo'


----------



## DoesNotMatter (28. Mrz 2011)

Ich kenn mich mit den verwendeten Funktionen nicht aus aber im Normalfall läuft der upload so ab:
1: Typ der zu übertragenden Daten bestimmen: "TYPE A\r\n", "TYPE E\r\n", "TYPE I\r\n", "TYPE L\r\n",  an Controlport des FTP - Servers schicken
2: "PASV\r\n" - Befehl an Ftp - Controlport senden.
3: Aus Serverreply Verbindung zu dem geöffnenten Passiven Datenport aufbauen.
    227 Entering Passive Mode (88,198,40,25,150,29), 150 = HighPort, 29 = LowPort 

```
int ftpPort = 0;
ftpPort += 150; ftpPort = ftpPort << 8;
ftpPort += 29;
```
4. "STOR FileName.dat\r\n" - Befehl an ControlPort senden.
5. Datenstream an geöffneten passiven Port senden
6. Nach erfolgreicher Datenübertragung unbedingt passive Verbindung schließen, damit man wieder msg an den Controlport senden kann

Ach ja nicht vergessen nach jedem Befehl den Serverreply rauszuziehen.
Vlt liegt irgentwo dor dein Fehler, der Upload sollte so ohne problem ablaufen, ansonsten hat der Server evtl Probleme.


----------



## Imothep (28. Mrz 2011)

So ... hatte ganz vergessen, dass ich noch einen Login habe

Danke für die schnelle und sehr hilfreiche Antwort. Habe die Datei wie folgt erfolgreich hochgeladen bekommen:


```
ftp.sendCommand("TYPE A\r\n");
System.out.println("Antwort: "+ftp.getReplyString());

ftp.sendCommand("PASV\r\n");
System.out.println("Antwort: "+ftp.getReplyString());

boolean success = ftp.storeFile("test.pdf",fInpuntStream);
```

Vielen dank 

der Imo'


----------

