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) {}
}
} }

FTPClient 中 FTPClient.changeWorkingDirectory(filePath) 代码一直返回 false的更多相关文章

  1. ftp中ftpClient类的API

    org.apache.commons.NET.ftp  Class FTPClient类FTPClient java.lang.Object java.lang.Object继承 org.apache ...

  2. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法【好用】

    转: Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录 ...

  3. 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了

    系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...

  4. FtpClient.storeFile返回false解决方法

    在确定路径和文件名没有中文的情况下添加以下代码 ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE); ftp.enterLocalPassiveMode();/ ...

  5. [转载] 在java中为什么变量1000 = 1000 返回false,但是100=100返回true?

    ps:题目的意思是指定义相同内容的不同变量之间的==比较.如果直接比较(100 == 100)的结果是true. 运行以下代码: Integer a = 1000, b = 1000; System. ...

  6. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  7. ios-UIWebView中js和oc代码的互调

    webview是ios中显示远程数据的网页控件,webview能显示的内容很多,MP4.文本.pdf等等: 关于js和oc代码的互相调用 1:oc中调用js代码; >>oc中调用js代码很 ...

  8. 在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...

  9. qemu-kvm-1.1.0源代码中关于迁移的代码分析

    这篇文档基于qemu-kvm-1.1.0源代码进行分析. 首先,源代码中的hmp-commands.hx文件里有下面内容: { .name = "migrate",/* 在moni ...

随机推荐

  1. Could not find a package,configuration file provided by "G2O" ,G2OConfig.cmake,g2o-config.cmake

    因为项目需要使用到g2o,所以自己从git上面clone下来, git clone https://github.com/RainerKuemmerle/g2o.git 然后: cd g2o mkdi ...

  2. (八)lambda、列表生成式、字典转list排序

    1.函数返回多个值: 1)函数如果return多个值的话,会把返回的这几个值放在一个元组里面 def say(): num1 = 1 num2 = 2 num3 = 3 return num1,num ...

  3. JDBC缺点分析

    * JDBC代码繁琐,每一次JDBC都需要编写“同样”的六步. * sql不能配置,在JDBC编程中sql语句是写在java源程序当中的,sql语句经常会发生改变(业务发生了改变),sql改变之后,需 ...

  4. tomcat/Java指定加载jar包的路径

    背景:部署的web站点,应用默认加载工程的/webapps/工程名/WEB-INF/lib下的jar包   但是我需要提供一个和web工程没关系的的jar包管理目录   解决方法: 执行java方法时 ...

  5. Blender Python脚本的6个技巧

    https://www.youtube.com/watch?v=vFoh3S8MLBI&index=3&list=PLw8Sjaw0TPm0J9DXj3XGi1_9fxXezlzrM ...

  6. 451. Sort Characters By Frequency将单词中的字母按照从高频到低频的顺序输出

    [抄题]: Given a string, sort it in decreasing order based on the frequency of characters. Example 1: I ...

  7. Django中操作Redis

    一 创建redis连接池 redis_pool.py pool = redis.ConnectionPool(host='10.211.55.4', port=6379) 二 引入连接池 import ...

  8. Django model进阶

    Django-model进阶   QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Ent ...

  9. Linux系统中的tar命令

    时间一长什么东西都容易忘记,尤其是一些不常用的东西忘记的更快,所以避免忘记,就记录下来,可以方面使用的时候查询.Tar命令在linux系统中算是一个比较重要的命令,今天就针对该命令进行总结一下. 1. ...

  10. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...