# Bilder: FTP-Upload funktioniert nicht richtig



## Prusik (6. Feb 2008)

Hallo zusammen
Ich habe ein Problem und zwar möchte ich dass der Benutzer Bilder von seinem Computer auswählen kann und diese danach raufladen. Und zwar werden Bilder zum Teil recht verzogen, kommen nicht ganz an, usw. 
	

	
	
		
		

		
			





 wird 
	

	
	
		
		

		
		
	


	




, Was mich noch mehr verwirrt ist, dass es zum teil geht, und immer wieder andere "Effekte" gibt. Manchmal ist nur die oberste Zeile vorhanden, bei gewissen Bildern funktioniert es auch. Ich kann jedoch keine regelmässigkeit feststellen. 

Die verschiedenen Klassen: Bild öffnet im Konstruktor einen JFileChooser. 

```
import java.io.File;

import javax.swing.JFileChooser;

public class Bild {
	private File pfad;
	public Bild(BildManager m){
		JFileChooser chooser = new JFileChooser();
	    FileNameExtensionFilter filter = new FileNameExtensionFilter(
	        "JPG & GIF Images", "jpg", "gif");
	    chooser.setFileFilter(filter);
	    int returnVal = chooser.showOpenDialog(m);
	    if(returnVal == JFileChooser.APPROVE_OPTION) {
	       System.out.println("You chose to open this file: " +
	            chooser.getSelectedFile());
	       
	        setPfad(chooser.getSelectedFile());
	    }
	}
	public String toString(){
		return "Bild";
	}
	public void setPfad(File pfad) {
		this.pfad = pfad;
	}
	public File getPfad() {
		return pfad;
	}

}
```
FTP Connection stellt die Verbindung zum Server her und lädt die Datei hoch. 

```
public class FTPConnection {
	FTPClient client;
	String server;
	String username;
	String pw;
	public FTPConnection(String server, String username, String pw){
		this.server = server;
		this.username=username;
		this.pw=pw;
		client = new FTPClient();

	}
	public void connect(){
		try {
			int reply;
			client.connect(server);
			client.login(username, pw);
			System.out.println("Connected to "+ server);
	    	System.out.println(client.getReplyString());
	        reply = client.getReplyCode();

	        if(!FTPReply.isPositiveCompletion(reply)) {
	          client.disconnect();
	          System.err.println("FTP server refused connection.");
	          System.exit(1);
	        }
	    	
		} catch (IOException e) {
			e.printStackTrace();
		} 		
	}
	//File hochladen
	public void putFile(String zielname, InputStream iS){
		try {
			client.storeFile(zielname, iS);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void disconnect(){
		try {
			if(client.isConnected()){
				client.disconnect();
				System.out.println("Disconnect vom Server");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		FTPConnection ftp = new FTPConnection("********","********","********");
		ftp.connect();
		ftp.putFile("bild.jpg",ftp.getClass().getResourceAsStream("bild.JPG")); //geht auch nicht bei jedem Bild!
		
		ftp.disconnect();
	}

}
```
BildManager speichert ein DefaultListModel mit den Bilden. die Methode bilderUploaden() lädt alle Bilder daraus hinauf. 

```
public class BildManager extends JFrame{
	private DefaultListModel bildList;
	public BildManager(){
		bildList = new DefaultListModel();
		this.getContentPane().setLayout(new BorderLayout());
		
		JList bildList = new JList();
		bildList.setModel(this.bildList);
		
		this.getContentPane().add(bildList, BorderLayout.CENTER);
		
		JPanel south = new JPanel();
		south.setLayout(new FlowLayout());
		
		JButton but_hinzufuegen = new JButton("Bild hinzufügen");
		but_hinzufuegen.addActionListener(new hinzufuegenListener());
		south.add(but_hinzufuegen);
		JButton but_ftp = new JButton("Veröffentlichen");
		but_ftp.addActionListener(new FTPhochladen());
		south.add(but_ftp);
		
		this.getContentPane().add(south,BorderLayout.SOUTH );
		this.setVisible(true);
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	public void bildHinzufuegen(){
		bildList.addElement(new Bild(this));
		this.pack();
	}
	
	public void bilderUploaden(){
		FTPConnection ftp = new FTPConnection("********","********","********");
		ftp.connect();
		for(int i =0; i<bildList.size();i++){
			Bild b = (Bild) bildList.get(i);
			System.out.println(b.getPfad() +" hochladen");

			try {
				ftp.putFile(b.getPfad().getName(), new FileInputStream(b.getPfad()));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		ftp.disconnect();
	}
	public static void main(String[] args) {
		BildManager m = new BildManager();
	}
	
	class hinzufuegenListener implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			bildHinzufuegen();
			
		}
		
	}
	class FTPhochladen implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			bilderUploaden();
			
		}
		
	}	

}
```
TUt mir leid, dass ich da so viel Code bringe - aber ich hab wirklich null Ahnung, was zur Lösung des Problems relevant ist. Bin für jeden Tipp dankbar.

Merci!


----------



## maki (6. Feb 2008)

Wahrscheinlich solltest du die Dateien im Binärformat übertragen, welche FTP API verwendest du?


----------



## Prusik (6. Feb 2008)

du bist super! Genau das wars! das ich nicht selbst darauf gekommen bin.. im nachhinein ist man immer gescheiter... 


```
client.setFileType(FTPClient.BINARY_FILE_TYPE);
```
 einfügen und schon gehts...

und übrigens:

```
import org.apache.commons.net.ftp.FTPClient;
```
 benutz ich... sei besser als das aus dem sun package...


----------

