31 Mayıs 2020 Pazar

FTPClient Sınıfı

Giriş
Şu satırı dahil ederiz.
import org.apache.commons.net.FTPClient;
FTP dışında bir de TFTP (Trivial Ftp) var. FTP protokolü TCP ile çalışır. TFTP ise UDP ile çalışır.

constructor
Şöyle yaparız
FTPClient client = new FTPClient( );
changeWorkingDirectory metodu
Şöyle yaparız
String remoteFolder = ...;

if(ftpClient.changeWorkingDirectory(remoteFolder)) {
  ...
}
connect metodu
Şöyle yaparız
FTPClient client=new FTPClient();
client.connect("/*Same IP Address As Server*/",8001);

client.enterLocalPassiveMode();

client.logIn("Test","123");
enterLocalPassiveMode metodu
Açıklaması şöyle
Originally, the FTP protocol connected back from the server to a client to actually transfer files through that new connections. 14 years later after the introduction of the FTP, the 'passive mode' was added to it, so that only client connects to server ever, however a need for multiple connections remained.
Şöyle yaparız.
ftpClient.enterLocalPassiveMode();
enterRemoteActiveMode metodu
Açıklaması şöyle.
At least for FTP, the actual file transfer happened over a different connection to support a particular file transfer mode that isn't used much today. Suppose you have three machines, A, B, C, and you want to transfer a file from machine A to machine B. You are logged in to an FTP client on machine C. 
Şeklen şöyle.
       +----------+               +----------+
        |          |    Bulk data  |          |
        | Server A +-------------->+ Server B |
        |          |               |          |
        +----------+               +----------+
             ^                           ^
             |                           |
    Control  |                           |  Control
             |                           |
             |       +------------+      |
             |       |            |      |
             +-------+  Client C  +------+
                     |            |
                     +------------+
Açıklaması şöyle.
That means you can, from C, log in to FTP on both machine A and machine B, and with the right combination of PORT commands, you can set up a transfer from A to B where the actual file data does not go through machine C. This helped if the bandwidth between A and B was much greater than the bandwidth available to C.
listFiles metodu
Şöyle yaparız
FTPFile[] files = ftpClient.listFiles(directoryName);
login metodu
Örnek
Şöyle yaparız.
boolean success = ftpClient.login(user, pass);
Örnek
Şöyle yaparız
FTPClient ftpClient = new FTPClient();
ftpClient.setDefaultTimeout(this.timeout);

try {
  ftpClient.connect(this.host, this.port);
  ftpClient.setSoTimeout(this.timeout);
  if (!ftpClient.login(username, password)) {
    return null;
  }
} catch (IOException e) {
  return null;
}
getReplyCode metodu
Şöyle yaparız.
int reply = client.getReplyCode();
if ((reply != 125) && (!FTPReply.isPositiveCompletion(reply))) {
  throw new IOException("..." + client.getReplyString());
}
getReplyStrings metodu
Şöyle yaparız.
String[] replies = ftpClient.getReplyStrings();
if (replies != null && replies.length > 0) {
  for (String aReply : replies) {
   ...
  }
}
retrieveFile metodu
Belirtilen OutputStream'e dosyayı indirir
Örnek
Şöyle yaparız.
FTPClient client = new FTPClient( );
OutputStream outStream;
try {

  client.connect( "server" );
  client.login("noman@mindzone.co.in", "pass");

  String remoteFile = "Pages/page0001.png";
  outStream = new FileOutputStream( "C:\\asd.png" );
  client.retrieveFile(remoteFile, outStream);

} catch(IOException ioe) {
  ...
} finally {
  try {
    client.disconnect( );
  } catch (IOException e) {
    ...
  }
}
Örnek
Şöyle yaparız
try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(...))) {
  // These lines set the type of file to be binary.
  // I had some issues that the file downloaded corrupted.
  ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
  ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  ftpClient.setConnectTimeout(timeout);

  ftpClient.retrieveFile(remoteFilePath, outputStream);
}
retrieveFileStream metodu
Şöyle yaparız
InputStream is = ftpClient.retrieveFileStream(filename);
setConnectTimeout metodu
Şöyle yaparız.
ftpClient.setConnectTimeout(10000);
setDataTmeout metodu
Şöyle yaparız
client.setSoTimeout(10000);//Wait 10 seconds for upload to complete
client.setDataTimeout(10000);//Timeout if no data transfer for 10 seconds
setDefaultTimeout metodu
Şöyle yaparız.
ftpClient.setDefaultTimeout(10000);
setSoTimeout metodu
Socket timeout anlamına gelir.
Örnek
Login timeout için şöyle yaparız
client.setConnectTimeout(5000);  //5000 ms to wait 
client.connect(ip,port);
if(!FTPReply.isPositiveCompletion(client.getReplyCode()))
{
  client.disconnect();
  return;
}
client.enterLocalPassiveMode(); //This Solves Part 2 Of My Problem

//These 3 lines of code are what solved my login problem
{  //Wait at least 5 seconds for login
  client.setSoTimeout(5000);

  //Send Keep Alive Message every second
  client.setControlKeepAliveTimeout(1);
  //Wait at least 5 seconds to respond to my KeepAlive messages
  client.setControlKeepAliveReplyTimeout(5000);
}
boolean success=client.login(...,...);
if(!success)
{
  client.disconnect();
  return;
}
setFileType metodu
Açıklaması şöyle.
FTPClient uses TEXT_FILE_TYPE by default. So you have to set file type to binary as follows:
Şöyle yaparız.
client.setFileType(FTP.BINARY_FILE_TYPE);
storeFile metodu
Şöyle yaparız.
public boolean uploadSingleFile(FTPClient ftpClient, String localFilePath, 
  String remoteFilePath)
  throws IOException {
  File localFile = new File(localFilePath);

  InputStream inputStream = new FileInputStream(localFile);
  try {
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    return ftpClient.storeFile(remoteFilePath, inputStream);
  } finally {
    inputStream.close();
   }
}
storeFileStream metodu
Şöyle yaparız.
OutputStream os = client.storeFileStream("JOB.TXT");
os.write(...);
os.close();