Apache FTPS客户端storeFile到Windows从Unix/Linux/Max问题的FTPS服务器

问题描述:

我有一个问题,从Unix/Mac/Linux env将文件传输到Windows FTP服务器。Apache FTPS客户端storeFile到Windows从Unix/Linux/Max问题的FTPS服务器

虽然完全相同的java代码从Windows PC工作。 从* NIX/Mac的转移才做这个的FTP会话命令我的Windows机器上

set ftps:initial-prot 
set ftp:ssl-force true 
set ftp:ssl-protect-data true 
set ssl:verify-certificate no 

,而我没有需要他们 - 我认为它涉及到系统变量。

这是我的Java代码

protected FTPClient getClient(DeliveryDetails details) { 
    return new FTPSClient(false); // the connection is Explicit 
} 

public void setClient(FTPClient client, DeliveryDetails details) throws Exception { 
    client.setConnectTimeout(10000); 
    client.setDefaultTimeout(1000 * 60 * 2); 
    client.setControlKeepAliveTimeout(300); 
    client.setDataTimeout(15000); 
    client.connect(ftpDetails.host, ftpDetails.port); 
    client.setBufferSize(1024 * 1024); 
    client.login(ftpDetails.username, ftpDetails.getSensitiveData()); 
    client.setControlEncoding("UTF-8"); 
    client.setFileType(FTP.BINARY_FILE_TYPE); 
    client.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE); 
    FTPSClient ftpsClient = (FTPSClient) client; 
    ftpsClient.execPBSZ(0); 
    ftpsClient.execPROT("P"); 
    // both with it and without it didnt work ftpsClient.setWantClientAuth(false); 
} 

public void saveToServer(FTPClient client, File fileName, InputStream stream){ 
    BufferedInputStream bis = new BufferedInputStream(stream); 
    boolean isSaved = client.storeFile(filename, bis); 
    client.logout(); 
} 

什么是相当于这个参数在FTPS阿帕奇类的?

set ftps:initial-prot 
set ftp:ssl-force true 
set ftp:ssl-protect-data true 
set ssl:verify-certificate no 
+0

1)什么是'设置FTPS:初始prot'和其他?这些'lftp'命令?不要让我们猜测!告诉我们! 2)代码在Mac和* nix上做了什么?告诉我们!确切的错误消息,日志文件,任何东西! –

看来,Windows NT不支持写入数据FTP.BLOCK_TRANSFER_MODE

简单的解决方法是

private static final String WINDOWS_NT_SYTEM_TYPE = "Windows_NT"; 
    .... 
    .... 
    try { 
      String res = client.getSystemType(); 
      if (res.equals(WINDOWS_NT_SYTEM_TYPE)) { 
       client.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); 
      } else { 
       client.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE); 
      } 
     }