FTPClient.listFiles()不能獲取目錄裏的文件

寫個功能要從ftp服務下載文件,在本地的ftp服務一切ok(window環境),可是在Linux環境發現無論切換到哪一個目錄,獲取什麼文件,調用FTPClient.listFiles()方法時返回的始終爲空,可是代碼又運行正常沒有異常拋出。而後斷點ftp.getReplyCode()也返回230登錄成功.linux

解決的方很簡單,安全

在調用FTPClient.listFiles()方法前,先調用FTPClient.enterLocalPassiveMode();就能夠了。服務器

/**
     * 從FTP服務器上下載文件
     * @param ftpDirectoryAndFileName ftp服務器文件路徑,以/dir形式開始
     * @param localDirectoryAndFileName 保存到本地的目錄
     * @return
     */
    public boolean get(String ftpDirectoryAndFileName, String localDirectoryAndFileName) {
        File file=new File(localDirectoryAndFileName);
        if (!file.exists())file.mkdirs();
        if (!ftpClient.isConnected()) {
            return false;
        }
        ftpClient.enterLocalPassiveMode(); // Use passive mode as default
        try {
            // 將路徑中的斜槓統一
            char[] chars = ftpDirectoryAndFileName.toCharArray();
            StringBuffer sbStr = new StringBuffer(256);
            for (int i = 0; i < chars.length; i++) {
                if ('\\' == chars[i]) {
                    sbStr.append('/');
                } else {
                    sbStr.append(chars[i]);
                }
            }
            ftpDirectoryAndFileName = sbStr.toString();
            String filePath = ftpDirectoryAndFileName.substring(0, ftpDirectoryAndFileName.lastIndexOf("/"));
            String fileName = ftpDirectoryAndFileName.substring(ftpDirectoryAndFileName.lastIndexOf("/") + 1);
            this.changeDir(filePath);
            ftpClient.retrieveFile(new String(fileName.getBytes(), "iso-8859-1"),
                    new FileOutputStream(localDirectoryAndFileName)); // download
            // file
            System.out.println(ftpClient.getReplyString()); // check result
            System.out.println("線程"+Thread.currentThread().getName()+"從ftp服務器上下載文件:" + ftpDirectoryAndFileName + ", 保存到:" + localDirectoryAndFileName);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }app

調用FTPClient.enterLocalPassiveMode();這個方法的意思就是每次數據鏈接以前,ftp client告訴ftp server開通一個端口來傳輸數據。爲何要這樣作呢,由於ftp server可能每次開啓不一樣的端口來傳輸數據,可是在linux上,因爲安全限制,可能某些端口沒有開啓,因此就出現阻塞。
--------------------- 
做者:是飯七分飽 
來源:CSDN 
原文:https://blog.csdn.net/hu15903314850/article/details/79887604 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!this

相關文章
相關標籤/搜索