FTP文件下载需要的jar包:

commons-net-2.0.jar  有时可能还需要:jakarta-oro.jar

参考:FTPClient参考文档

这里记录下我碰到的问题:

刚开始我的账号和密码直接都配的是我们公司SSH连接服务器的用户名和密码,只是把端口改成了21,原端口是7979,程序竟然能连接上登录成功。

一共有两个IP,A(124.237.121.6) 和 B(124.237.121.126),连接A的时候一切正常,连接B的时候在切换工作目录的时候一直切不过去,changeWorkingDirectory返回的一直是false。

于是开始查询资料,网上总结了下大约有这几种情况:

1、传入的路径含有中文,需要进行转码操作,我的路径没有中文,排除。下面的代码中我添加了这种情况的解决办法。

2、登录后默认目录不是根目录,如果切换的路径写的是相对路径,在切换目录的时候就会找不到(不以“/”开头的路径是相对路径;以“/”开头的路径是绝对路径),我都用的是绝对路径,所以这种情况排除。

3、账号权限问题,我碰到的问题应该归到这种情况中。

我们服务器上的完整目录大概是这样的:/site/wdxcorder/xxx/xxxx/xxx/......

A和B上的文件都在/site/wdxcorder/autoCompose/下

到这里我已经发现用错账号了,从数据库中找到FTP服务器正确的账号和密码,端口还是21。

这个账号能登陆A和B,虽然根目录也都相同,登陆后都是直接访问的/site/文件夹下的内容,区别在于A上面该账号有权限回退访问/site/的上一级目录,但是B上面该账号却没有权限回退访问到/site/的上一级目录

所以,A上面文件/site/wdxcorder/autoCompose/aaa.jpg可以正常访问到,而B上/site/wdxcorder/autoCompose/bbb.jpg 却不能访问到。

账号权限不能改动,所以只能改目录了,程序里添加了判断,访问B上文件的时候把路径中的/site干掉,ok,问题解决!

FTP下载文件工具类:

 package com.wdxc.util;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger; /**
* FTP文件下载
* @author wangbo
*
*/
public class FTPUtil { private static Logger logger = Logger.getLogger(FTPUtil.class);
private static int port = 21;
private static String username = "xxxxxx";
private static String password = "xxxxxxxxxxxxxxxxxx"; public static boolean fileDown(String ip,String fileDir,String saveFTPDir){ FTPClient ftp = null;
File file = new File(saveFTPDir);
if(!file.exists() && !file.isDirectory()){//如果文件夹不存在则创建
logger.debug("文件目录不存在,创建。");
file.mkdirs();
}
try{
//ftp的数据下载
ftp = new FTPClient();
ftp.connect(ip, port);
ftp.login(username, password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//传输图片的话设置文件类型为二进制
//ftp.setControlEncoding("UTF-8");//如果有中文文件名的话需要设置 //设置linux环境
FTPClientConfig conf = new FTPClientConfig( FTPClientConfig.SYST_UNIX);
ftp.configure(conf); //判断是否连接成功
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
logger.debug("FTP服务无法连接!");
return false;
} //设置访问被动模式
ftp.setRemoteVerificationEnabled(false);
ftp.enterLocalPassiveMode(); //切换工作目录到文件所在的目录
//boolean dir = ftp.changeWorkingDirectory(new String(fileDir.getBytes(),FTP.DEFAULT_CONTROL_ENCODING));//如果是中文路径需要处理
boolean dir = ftp.changeWorkingDirectory(fileDir);
if (dir) {
//检索ftp目录下所有的文件
FTPFile[] fs = ftp.listFiles();
for(FTPFile f : fs){
File localFile = new File(saveFTPDir+f.getName());
OutputStream ios = new FileOutputStream(localFile);
ftp.retrieveFile(f.getName(), ios);
ios.close();
}
return true;
}else {
logger.debug("服务器编码方式可能有问题,请检查!");
return false;
}
}catch (Exception e){
e.printStackTrace();
logger.debug("ftp下载文件发生异常!");
return false;
}finally{
if(ftp != null) try {ftp.disconnect();} catch (IOException ioe) {}
}
} }

最新文章

  1. 【Win 10应用开发】延迟加载图片的另一种方法
  2. ASP.NET MVC 简介
  3. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
  4. Android高级控件--AdapterView与Adapter
  5. jxl读数据库数据生成xls 并下载
  6. HDU 5009 Paint Pearls 双向链表优化DP
  7. codeforces 557 D. Vitaly and Cycle 组合数学 + 判断二分图
  8. 我的一点关于把WndProc指向类的成员函数的看法
  9. EBS收单方/收货方
  10. Fiddler AutoResponder正则替换
  11. SIP DB33标准笔记 注册/目录发送/心跳
  12. Swift 入门之简单语法(六)
  13. SMEM介绍
  14. MySQL 数据查询
  15. Linux centos7.5操作系统的安装
  16. spring boot通过Interceptor和HandlerMethodReturnValueHandler实现统一处理为controller返回对象统计处理时间
  17. Spring的第四天AOP之注解版
  18. Mysql undo redo 总结
  19. collection my favoriate websites
  20. Win10系列:VC++绘制几何图形2

热门文章

  1. Ubuntu输入命令无效的问题
  2. cdnbest独立主控配置自定义错误页面
  3. 【JAVA】杨辉三角
  4. python note 02 格式化与判断、字符串转换
  5. @RequestBody配合@JsonFormat注解实现字符串自动转换成Date
  6. GitHub下载子目录
  7. swift 监测内存泄漏 MLeaksFinder
  8. node.js 调试问题
  9. 三次样条插值算法C++实现
  10. Array of Doubled Pairs LT954