码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-29 15:10:22      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:gdi   row   nbsp   红色   man   show   用户名   oid   trace   

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)指定文件夹内的文件

标签:gdi   row   nbsp   红色   man   show   用户名   oid   trace   

原文地址:https://www.cnblogs.com/hm1990hpu/p/8143388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!