2014-04-22 12 views
5

Ich versuche, einen FTP-Client und Server zu schreiben, mit dem ich eine Datei vom Client an den Server über anonymes FTP senden kann. Jedoch bekomme ich immer 550 Permission Denied. Ich kann andere Dinge tun, wie zum Beispiel eine Datei vom Server herunterladen oder eine Liste der Dateien im Verzeichnis abrufen, aber wenn ich versuche, einen Download zu machen, heißt es 550 Permission Denied. Das Ergebnis ist das gleiche, ob ich mich anmelde oder anonymes FTP verwende.FTP-Client wird immer verweigert Erlaubnis zum Hochladen von Server

Ich sehe keine Probleme mit meinem Code, aber ich habe versucht, es auf verschiedenen Netzwerken und Computern mit dem gleichen Ergebnis auszuführen. Gibt es ein Problem mit dem Code, den ich nicht sehe, oder muss ich etwas mit dem Router/der Firewall machen?

Ich schreibe sowohl den Client und Server in Java und Windows ausgeführt. Die Bibliotheken, die ich verwende, sind Apache Commons FTP Client und Apache FTP Server.

Hier ist der Client. Der auskommentierte Code dient zum Hochladen und Abrufen einer Liste der Dateien im Verzeichnis.

import org.apache.commons.net.ftp.*; 
import java.io.*; 
import java.net.*; 

public class Client 
{ 
    public Client() 
    { 
     // Do nothing 
    } 

    public void transferFile(String ipAddress) 
    { 
     // For uploading 
     FileInputStream file = null; 
     // For downloading 
     // FileOutputStream file = null; 

     try 
     { 
      InetAddress address = InetAddress.getByName(ipAddress); 

      FTPClient ftpClient = new FTPClient(); 
      ftpClient.connect(address, 5000); 
      ftpClient.login("anonymous", ""); 
      ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
      ftpClient.enterLocalPassiveMode(); 

      // For uploading 
      file = new FileInputStream(new File("C:/SoundFiles/Send/Test1.txt")); 
      // For downloading 
      // file = new FileOutputStream(new File("C:/SoundFiles/Receive/Test2.txt")); 

      // For uploading 
      boolean success = ftpClient.storeFile("/Receive/Test2.txt", file); 
      // For downloading 
      // boolean success = ftpClient.retrieveFile("/Send/Test1.txt", file); 

      // For listing the files on the server's directory 
      /* 
      FTPFile[] directoryFiles = ftpClient.listFiles(); 
      System.out.println("There are " + directoryFiles.length + " files"); 
      for(int i = 0; i < directoryFiles.length; i++) 
      { 
       System.out.println(i + ": " + directoryFiles[i].getName()); 
      } 
      */ 

      if(success) 
       System.out.println("Success."); 
      else 
       System.out.println("Fail."); 

      ftpClient.logout(); 
      ftpClient.disconnect(); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       if(file != null) 
        file.close(); 
      } 
      catch(IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     Client client = new Client(); 
     client.transferFile("Enter your IP address here"); 
    } 
} 

Hier ist der Server.

import org.apache.ftpserver.FtpServer; 
import org.apache.ftpserver.FtpServerFactory; 
import org.apache.ftpserver.ConnectionConfigFactory; 
import org.apache.ftpserver.usermanager.impl.BaseUser; 
import org.apache.ftpserver.listener.ListenerFactory; 
import org.apache.ftpserver.ftplet.FtpException; 
import org.apache.ftpserver.ftplet.UserManager; 

public class Server 
{ 
    public Server() 
    { 
     // Do nothing 
    } 

    public void startServer() 
    { 
     FtpServer server = null; 

     try 
     { 
      FtpServerFactory ftpServerFactory = new FtpServerFactory(); 

      ListenerFactory listenerFactory = new ListenerFactory(); 
      listenerFactory.setPort(5000); 
      ftpServerFactory.addListener("default", listenerFactory.createListener()); 

      ConnectionConfigFactory configFactory = new ConnectionConfigFactory(); 
      configFactory.setAnonymousLoginEnabled(true); 
      ftpServerFactory.setConnectionConfig(configFactory.createConnectionConfig()); 

      BaseUser user = new BaseUser(); 
      user.setName("anonymous"); 
      user.setPassword(""); 
      user.setHomeDirectory("C:/SoundFiles"); 
      UserManager userManager = ftpServerFactory.getUserManager(); 
      userManager.save(user); 

      server = ftpServerFactory.createServer(); 
      server.start(); 
     } 
     catch (FtpException e) 
     { 
      e.printStackTrace(); 
     } 

     // Stop the server after 10 seconds 
     try 
     { 
      Thread.sleep(10000); 
     } 
     catch(InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 

     if(server != null) 
      server.stop(); 
    } 

    public static void main(String[] args) 
    { 
     Server server = new Server(); 
     server.startServer(); 
    } 
} 

Dies ist die Ausgabe, die ich vom Server bekomme.

[main] INFO org.apache.ftpserver.impl.DefaultFtpServer - FTP server started 
[NioProcessor-3] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - CREATED 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - OPENED 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 220 Service ready for new user. 

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: USER anonymous 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 331 Guest login okay, send your complete e-mail address as password. 

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: PASS 
[pool-3-thread-1] INFO org.apache.ftpserver.command.impl.PASS - Anonymous login success - null 
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 230 User logged in, proceed. 

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: TYPE I 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 200 Command TYPE okay. 

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: PASV 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 227 Entering Passive Mode 

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: STOR /Receive/Test2.txt 
[pool-3-thread-2] WARN org.apache.ftpserver.impl.PassivePorts - Releasing unreserved passive port: 2133 
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 550 /Receive/Test2.txt: Permission denied. 

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: QUIT 
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 221 Goodbye. 

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - CLOSED 

Alle Vorschläge, wie ich dies zur Arbeit bekommen kann, sind sehr geschätzt.

+0

Ist das '/ Receive'-Verzeichnis vom FTP-Server beschreibbar? –

Antwort

8

Ich fand schließlich heraus, was fehlte. Ich musste nur die folgenden Codezeilen in der Server-Klasse hinzufügen.

List<Authority> authorities = new ArrayList<Authority>(); 
authorities.add(new WritePermission()); 
user.setAuthorities(authorities); 
Verwandte Themen