2014-10-09 116 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(),所以試圖打開文件的另一個流總是失敗。唷!

相關問題