一、什么是FTP?
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
二、FTP服务器
本篇文章使用easyftp-server,具体界面如下:
web网页界面如下:
Java实现连接FTP服务器需要导入:
三、文件上传至FTP服务器
主要步骤:
1.创建FTP客户端对象;
2.创建文件输入流、用于创建本地文件;
3.连接FTP服务器;
4.登录;
5.切换指定目录;
6.设置文件类型;
7.将本地文件上传至FTP服务器。
示例代码如下:
package com.fulian.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
public class Upload {
public static void main(String[] args) {
// 创建FTP客户端对象
FTPClient ftpClient = new FTPClient();
// 创建文件输入流,用于创建本地文件
try (FileInputStream loginIn = new FileInputStream("D:\\test\\douban\\卡夫卡传.jpg");){
// 连接FTP服务器
ftpClient.connect("192.168.254.104", 21);
// 登录
ftpClient.login("root", "root");
// 切换至指定目录
boolean isChange = ftpClient.changeWorkingDirectory("XianCao");
System.out.println("切换工作目录1:" + isChange);
if(!isChange) {
ftpClient.makeDirectory("XianCao");
isChange = ftpClient.changeWorkingDirectory("XianCao");
}
System.out.println("切换工作目录2:" + isChange);
// 存储文件(将本地文件上传至FTP服务器)
// 参数1:ftp服务器存储位置
// 参数2:本地的文件输入流
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 存储前设置文件类型
boolean isUpload = ftpClient.storeFile("XianCao.jpg",loginIn);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
四、FTP服务器下载文件
主要步骤:
1.创建FTP客户端对象;
2.创建文件输出流、用于下载FTP服务器中的文件写入;
3.连接FTP服务器;
4.登录;
5.切换指定目录;
6.设置文件类型;
7.从FTP服务器中下载指定文件。
示例代码如下:
package com.fulian.demo;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
public class DownLoad {
public static void main(String[] args) {
String downLoadFileName = "XianCao.jpg";
FTPClient ftpClient = new FTPClient();
try (FileOutputStream out = new FileOutputStream("d:\\test\\aaa\\"+downLoadFileName);){
ftpClient.connect("192.168.254.104", 21);
ftpClient.login("root", "root");
ftpClient.changeWorkingDirectory("XianCao"); //切换目录
// 下载文件(获取FTP服务器指定目录)
// 参数1:服务器指定文件
// 参数2:本地输出流(负责下载后写入)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean isRetrive = ftpClient.retrieveFile(downLoadFileName, out);
System.out.println("下载成功?" + isRetrive);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: