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

该Java代码示例展示了如何使用Apache Commons Net库连接FTP服务器并列出指定路径下的所有文件。通过设置被动模式解决Linux FTP服务器的数据传输问题。
摘要由CSDN通过智能技术生成

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 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上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值