2014-10-09 66 views
0

我正在创建一个在Coldfusion中使用的类来替换cfftp标签,以便我可以通过SSL执行FTP。我有一个自定义标签,可以使用FTPClient或FTPSClient与类进行交互。连接,登录,放置文件,更改目录,列出文件都是可行的,但我无法为我的生活获取文件。我已经尝试了retrieveFile()和retrieveFileStream方法,但都不起作用。下面是我使用retrieveFileStream()实现的getFile方法,并且输入流始终为空,无论如何。该文件在那里,权限是好的。在这一点上我不知道。我可以通过WSFTP连接并获取文件,而不会出现任何问题,所以我认为这是我实现中的一些内容。任何帮助表示赞赏!Coldfusion 11 Apache Commons 3.0.1 FTPClient RetrieveFileStream()返回null

public void getFile(String localFileName, String remoteFileName, String transferMode) { 
    try { 
     int transferFileType = 0; 

     existsFile(remoteFileName); 

     if (getReturnValue() != "YES" || replyCode == 550) { 
      throw new IOException("File " + remoteFileName + " does not exist"); 
     } 
     else { 
      Boolean transferComplete = false; 
      File downloadFile = new File(localFileName); 
      OutputStream output = new BufferedOutputStream(new FileOutputStream(downloadFile)); 
      InputStream input; 
      byte[] bytesArray = new byte[4096]; 
      int bytesRead = -1; 

      if (!downloadFile.canWrite()) { 
       setSucceeded(false); 
       output.close(); 
       throw new IOException("Cannot write to file " + localFileName); 
      } 
      if (!isConnected()) { 
       setSucceeded(false); 
       output.close(); 
       throw new IOException("Connection closed by server."); 
      } 

      if (getSecure()) { 

       if (transferMode.toUpperCase() == "BINARY") { 
        ftps.setFileType(ftps.BINARY_FILE_TYPE); 
       } 
       else { 
        ftps.setFileType(ftps.ASCII_FILE_TYPE); 
       } 

       ftps.enterLocalPassiveMode(); 
       ftps.setRemoteVerificationEnabled(false); 

       try { 

        input = ftps.retrieveFileStream(remoteFileName); 
        setReplyCode(true); 
        if (input == null || replyCode == 550) { 
         setSucceeded(false); 
         output.close(); 
         throw new IOException("Cannot read file " + remoteFileName); 
        } 
        else { 
         while ((bytesRead = input.read(bytesArray)) != -1) { 
          output.write(bytesArray, 0, bytesRead); 
          output.flush(); 
         } 

         input.close(); 
         output.close(); 
         transferComplete = ftps.completePendingCommand(); 
         setReplyCode(true); 
        } 
       } 
       catch (IOException e) { 
        processError(e); 
       } 
      } 
      else { 

       if (transferMode.toUpperCase() == "BINARY") { 
        ftp.setFileType(ftps.BINARY_FILE_TYPE); 
       } 
       else { 
        ftp.setFileType(ftps.ASCII_FILE_TYPE); 
       } 

       ftp.enterLocalPassiveMode(); 
       ftp.setRemoteVerificationEnabled(false); 

       try { 

        input = ftp.retrieveFileStream(remoteFileName); 
        setReplyCode(true); 
        if (input == null || replyCode == 550) { 
         setSucceeded(false); 
         output.close(); 
         throw new IOException("Cannot read file " + remoteFileName); 
        } 
        else { 
         while ((bytesRead = input.read(bytesArray)) != -1) { 
          output.write(bytesArray, 0, bytesRead); 
          output.flush(); 
         } 

         input.close(); 
         output.close(); 
         transferComplete = ftp.completePendingCommand(); 
         setReplyCode(true); 
        } 
       } 
       catch (IOException e) { 
        processError(e); 
       } 
      } 
      //setReturnValue("Bytes Read: " + Integer.toString(bytesRead)); 
      setSucceeded(transferComplete); 
      setReplyCode(true); 
     } 
    } 
    catch (IOException e) { 
     processError(e); 
    } 
} 

这里是我打开的连接方法:

public void open (String server_in, int port_in, int timeout_in, String username_in, String password_in, Boolean implicit_in, Boolean secure_in) { 
    try { 
     FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); 

     if (secure_in) { 
      setSecure(true); 
      ftps = new FTPSClient("SSL", implicit_in); // Create the client object 
      ftps.configure(conf); // Set the system type 
      String[] protocolVersions = {"SSLv3"}; 
      ftps.setEnabledProtocols(protocolVersions); // Enable SSLv3 protocol 
      ftps.setAutodetectUTF8(true); // Enable auto detect 
      ftps.connect(server_in, port_in); // Connect 
      setReplyCode(true); // Get server response 

      ftps.setConnectTimeout(timeout_in); 

      if (!FTPReply.isPositiveCompletion(replyCode)) 
      { 
       ftps.disconnect(); 
       throw new Exception("FTP server refused connection."); 
      } 

      ftps.login(username_in, password_in); 
      setReplyCode(true); // Get server response 

      ftps.execPBSZ(0); // Set protection buffer to 0 
      ftps.execPROT("P"); // Private protocol 
      ftps.enterLocalPassiveMode(); 
     } 
     else { 
      setSecure(false); 
      ftp = new FTPClient(); // Create the client object 
      ftp.configure(conf); // Set the system type 
      ftp.connect(server_in, port_in); 
      setReplyCode(true); // Get server response 
      ftp.setAutodetectUTF8(true); // Enable auto detect 
      ftp.setConnectTimeout(timeout_in); 

      if (!FTPReply.isPositiveCompletion(replyCode)) 
      { 
       ftp.disconnect(); 
       throw new Exception("FTP server refused connection."); 
      } 

      ftp.login(username_in, password_in); 
      setReplyCode(true); // Get server response 
      ftp.enterLocalPassiveMode(); 
     } 

     setSucceeded(true); 
    } 
    catch (Exception e) { 
     processError(e); 
    } 
} 
+0

我知道这里有很多与CF11的交互,但问题的关键是Java的Java调用。我想我错过了一些简单的东西,但我看不到它。让我知道你是否需要更多的信息,或者如果这个代码也可以在你的机器上运行! – Ryan 2014-10-10 13:42:22

回答

0

好了,想通了。如果你看看上面的getFile()方法,你会看到我首先检查文件是否存在existsFile(remoteFileName)。那么,我用来查看文件是否存在的方法是在try块中使用retrieveFileStream()打开一个InputStream,并在失败时抛出一个错误。我从来没有在existsFile()的retrieveFileStream()之后调用completePendingCommand(),所以试图打开文件的另一个流总是失败。唷!

相关问题