2014-04-22 16 views
5

Sto cercando di scrivere un client FTP e server che mi consenta di inviare un file dal client al server tramite FTP anonimo. Tuttavia, continuo a ricevere 550 Permission Denied. Sono in grado di fare altre cose come scaricare un file dal server, o ottenere un elenco dei file nella directory, ma ogni volta che provo a fare un download dice 550 Permission Denied. Il risultato è lo stesso sia che acceda o che usi l'FTP anonimo.FTP Client continua a ottenere il permesso di caricare negato dal server

Non vedo alcun problema con il mio codice, ma ho provato a eseguirlo su reti e computer diversi con lo stesso risultato. C'è un problema con il codice che non vedo o devo fare qualcosa con il router/firewall?

Sto scrivendo sia il client che il server in Java e in esecuzione Windows. Le librerie che sto utilizzando sono Apache Commons FTP Client e Apache FTP Server.

Ecco il client. Il codice commentato è per il caricamento e ottenere un elenco dei file nella directory.

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"); 
    } 
} 

Ecco il 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(); 
    } 
} 

Questo è l'output che continuo a ricevere dal server.

[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 

Qualsiasi suggerimento su come posso farlo funzionare è molto apprezzato.

+0

La directory '/ Receive' è scrivibile dal server FTP? –

risposta

8

Ho finito per scoprire cosa mancava. Ho solo bisogno di aggiungere le seguenti righe di codice nella classe Server.

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