一.首先登录ftp服务器:命令行 lftp user@ip  上传:put  下载: get

二. 关于FTP传输模式与传输的方式

众所周知,FTP传输有两种工作模式,Active Mode和Passive Mode(主动模式和被动模式),简单描述连接过程如下:

  1.主动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 客户端在命令链路上用PORT命令告诉服务器:“我打开了***端口,你过来连接我”。于是服务器从20端口向客户端的***端口发送连接请求,建立一条数据链路来传送数据。

  2.被动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***端口,你过来连接我”。于是客户端向服务器的***端口发送连接请求,建立一条数据链路来传送数据。

了解模式的目的,是为了了解端口。使用 FTP 传输时,至少会使用到两个 Port 来建立连接通道:

  • 一个为指令通道(Command Channel),默认使用 Port 21 建立,用来传输 FTP 指令,例如:列出清单(LIST)、变更目录(CWD)、取得目前的目录(PWD)、......等。

  • 另一个为数据通道(DATA Channel),默认使用 Port 20,但是会因 FTP Client 选择使用的模式不同而有所不同.

  1.ASCII传输方式

  假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。

  但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。

  2.二进制传输模式

  在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行

  文件到Windows系统,在对方系统上,此文件不能执行。

  如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果

  传输二进制文件,所有的位都是重要的

三.不多做解释,上传一段FTPS的代码

public class FtpsUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(FtpsUtil.class);

    /**
* 暴露的方法
*/
public boolean uploadFile(InputStream in, String dirName, String remoteFileName, String adder, int port, String userName, String userPassword) {
FTPSClient ftpClient = null;
try { LOGGER.info("uploadFile addr:{},port:{},userName:{},userPassword:{}", adder, port, userName, userPassword);
ftpClient = ftpConnection(adder, port, userName, userPassword); makeDirectory(ftpClient, dirName);
ftpClient.changeWorkingDirectory(dirName); boolean isUploadSuccess = ftpPut(ftpClient, remoteFileName, in);
if (isUploadSuccess) {
return true;
}
} catch (Exception e) {
LOGGER.error("上传文件失败了。。upload file Exception:", e);
} finally {
ftpClose(ftpClient);
}
return false;
} private FTPSClient ftpConnection(String adder, int port, String userName, String passWord) {
FTPSClient ftpClient = null;
try {
ftpClient = new FTPSClient(false);
ftpClient.connect(adder, port);
ftpClient.login(userName, passWord);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.execPROT("P");
ftpClient.enterLocalPassiveMode();
LOGGER.info("ftpconnection success");
} catch (Exception e) {
LOGGER.error("ftpconnection EXception:", e);
}
return ftpClient;
} private void makeDirectory(FTPSClient ftpClient, String dirName) {
try {
ftpClient.makeDirectory(dirName);
LOGGER.info("创建文件夹成功:{}", dirName);
} catch (Exception e) {
LOGGER.error("目录已经存在,无需创建");
}
} private boolean ftpPut(FTPSClient ftpClient, String filename, InputStream in) throws IOException {
try {
boolean result = ftpClient.storeFile(filename, in);
if (result) {
LOGGER.info("upload file success");
}
return result; } catch (Exception ex) {
LOGGER.error("上传文件发生异常了。。。", ex);
return false;
} finally {
if (in != null) {
in.close();
}
}
} private boolean ftpClose(FTPSClient ftpClient) {
try {
if (ftpClient != null) {
ftpClient.logout();
ftpClient.disconnect();
}
LOGGER.info("ftpClose success");
} catch (Exception e) {
LOGGER.error("ftpclose Exception:", e);
return false;
}
return true;
}
}

最新文章

  1. Word2vec多线程(tensorflow)
  2. c++的构造函数
  3. Intellij 打开就闪退或关闭
  4. div+css进度条
  5. Error:(1, 0) Your project path contains non-ASCII characters. This will most likely cause the build to fail on Windows. Please move your project to a different directory. See http://b.android.com/9574
  6. 工作总结:检查字符串合法性(C++)
  7. Android android:clickable 问题
  8. 虚拟化技术学习(一)在VMware虚拟机中安装KVM
  9. hadoop使用笔记
  10. iOS UIAlertController在Tableview中显示缓慢,迟钝,延迟
  11. lesson - 4 笔记 /inode / suid / sgid / sbit / chmod /umask / chown / rwx / wc /grep / tr / sort / cut /which / whereis / locate / find / ln /
  12. 自动化制作.framework
  13. CentOS7搭建SVN服务器
  14. ubuntu 14.04解决wifi连接不稳定问题
  15. centos 7创建ss服务(方式二)
  16. zsh+on-my-zsh配置教程指南(程序员必备)
  17. fastext 中文文本分类
  18. Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
  19. JVM总结-Java语法糖与Java编译器
  20. window.location.href

热门文章

  1. markdown语法测试
  2. web页面隐藏鼠标
  3. Jquery使select、radio某项选中
  4. AngularJs转换json日期/Date(00000)/
  5. emoji探寻之路
  6. bzoj2424 [HAOI2010]订货
  7. Windows消息传递机制详解
  8. WPF:设置弹出子菜单的是否可用状态及效果
  9. Java调用脚本
  10. python中的正则表达式(re模块)