java 获取服务器(ftp)指定文件夹内的文件

Posted 半入江风半入云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 获取服务器(ftp)指定文件夹内的文件相关的知识,希望对你有一定的参考价值。

package common.util;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
* 列出FTP服务器上指定目录下面的所有文件
*/
public class FTPListAllFiles {
private static Logger logger = Logger.getLogger(FTPListAllFiles.class);
public FTPClient ftp;
public ArrayList<String> arFiles;
private static final String FAR_SERVER_URL="***.***.***.***";
private static final int SERVER_PORT=21;
private static final String SERVER_USER="***";
private static final String SERVER_PWD="***";
private static final String path="/123/456/";
private static final String showPath="";
 

/**
* 登陆FTP服务器
* @param host FTPServer IP地址
* @param port FTPServer 端口
* @param username FTPServer 登陆用户名
* @param password FTPServer 登陆密码
* @return 是否登录成功
* @throws IOException
*/
public boolean login(String host,int port,String username,String password) throws IOException{
this.ftp.connect(host,port);
if(FTPReply.isPositiveCompletion(this.ftp.getReplyCode())){
if(this.ftp.login(username, password)){
this.ftp.setControlEncoding("GBK");
return true;
}
}
if(this.ftp.isConnected()){
this.ftp.disconnect();
}
return false;
}

/**
* 关闭数据链接
* @throws IOException
*/
public void disConnection() throws IOException{
if(this.ftp.isConnected()){
this.ftp.disconnect();
}
}

/**
* 递归遍历出目录下面所有文件
* @param pathName 需要遍历的目录,必须以"/"开始和结束
* @throws IOException
*/
public String List(String pathName) throws IOException{

StringBuffer filename=new StringBuffer();
if(pathName.startsWith("/")&&pathName.endsWith("/")){
String directory = pathName;
//更换目录到当前目录
this.ftp.changeWorkingDirectory(directory);
ftp.enterLocalPassiveMode();
FTPFile[] files = this.ftp.listFiles();
  if(files!=null){
    for (int i = 0; i < files.length; i++) {
      if(files[i].isFile()){
        String n=new String(files[i].getName().getBytes("gbk"),"utf-8");
        if(i==files.length-1){
        filename.append(n+","+showPath);
       }else{
          filename.append(n+",");
         }

      }
    }
   }
  }
    return filename.toString();
}

//获取指定文件夹内的文件名称
public static String getFilenames(){
  String names="";
  FTPListAllFiles f = new FTPListAllFiles();
  try {
     if(f.login(FAR_SERVER_URL, SERVER_PORT, SERVER_USER, SERVER_PWD)){
      names= f.List(path);
     }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{

        try {
            f.disConnection();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
        }

      return names;
  }
//测试
/* public static void main(String[] args) throws IOException {
  System.out.println(getFilenames());
} */
}

  注意:红色标记的代码很重要,如果Linux搭建的ftp环境没有开启被动模式传输数据时,一般不会读取到指定文件夹内的文件名称。

经过在网上查找相关的知识,该语句的作用为:

    调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。

 
















































































































以上是关于java 获取服务器(ftp)指定文件夹内的文件的主要内容,如果未能解决你的问题,请参考以下文章

Java工具-检验ftp服务器的指定文件是否存在

Java工具-检验ftp服务器的指定文件是否存在

java 根据文件获取文件名及路径的方法

Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本

Mongo 获取指定位置 10 英里内的所有文件

用java完成文件ftp上传下载