天天看點

FtpClient第一次下載下傳檔案成功,第二次封包件不存在問題解決

FtpClient同一個用戶端重複使用時,第一次下載下傳檔案正常,第二次再下載下傳檔案時,總是擷取不到檔案資訊,查找了很多文檔都沒有找到解決辦法,偶然間搜到一篇博文說每次使用FtpClient之後,調用一次ftpClient.getReply(),消耗一個FTP連結之後,下次再使用同一個用戶端連接配接就可以正常下載下傳檔案了。

後來增加了其他的一個Ftp伺服器的連接配接位址之後,發現ftpClient.getReply()調用的時候一直阻塞,導緻檔案下載下傳逾時,是以關鍵代碼:

int replyCode = ftpClient.getReplyCode();
if (200 == replyCode) {
    //消費一個連接配接,避免第二次擷取檔案為null的問題
    ftpClient.getReply();
}
      

最終代碼如下:

/**
     * 下載下傳該目錄下目前檔案名的到本地
     *
     * @param ftpPath     FTP伺服器上的相對路徑,例如:test/123
     * @param ftpFileName 儲存檔案到本地的路徑,例如:aaa.pdf
     * @return 成功傳回true,否則傳回false
     */
    public InputStream downLoadFileByName(String ftpAddress, Integer ftpPort, String ftpPath, String ftpFileName) throws Exception {
        // 登入
        FTPClient ftpClient = login(ftpAddress, ftpPort);
        String errorMsg;
        if (ftpClient != null) {
            try {
                String path = changeEncoding(ftpClient, (ftpPath.startsWith("/") ? "" : "/") + ftpPath);
                // 判斷是否存在該目錄
                if (!ftpClient.changeWorkingDirectory(path)) {
                    errorMsg = ftpPath + DIR_NOT_EXIST;
                    log.error(errorMsg);
                    throw new Exception(errorMsg);
                }
                int replyCode = ftpClient.getReplyCode();
                if (200 == replyCode) {
                    //消費一個連接配接,避免第二次擷取檔案為null的問題
                    ftpClient.getReply();
                }
                // 判斷該目錄下是否有檔案
                String[] fs = ftpClient.listNames(ftpFileName);
                if (fs == null || fs.length == 0) {
                    errorMsg = ftpPath + DIR_CONTAINS_NO_FILE + "==fileName:" + ftpFileName;
                    log.error(errorMsg);
                    throw new Exception(errorMsg);
                }
                InputStream inputStream = ftpClient.retrieveFileStream(ftpFileName);

                return inputStream;
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                closeConnect(ftpAddress);
                throw e;
            }
        }
        return null;
    }
           

以上隻是個人見解,如有不對的地方請各位指正,謝謝~