1:ftp简介
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。 FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
1.1:工作流程
在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互传输数据
1.2:工作模式
FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)。
1.3:传输方式
FTP的传输有两种方式:ASCII、二进制。
2:windows开启ftp服务
在自己的电脑上可以开启一个ftp服务用于测试。 1:打开控制面板—》程序—》启动或关闭windows功能 找到互联网信息服务勾选?其中的ftp服务器,web管理,万维网服务。 系统就会安装IIS服务管理器了,安装过程可能需要等待几分钟。 2:回到电脑桌面,右击“计算机”,点击 管理,进入计算机管理界面。在这里,我们就可以看到刚刚添加的IIS服务,接下来的操作就像我们在VPS主机上添加网站差不多的操作步骤了。选中IIS服务——》网站——》右键添加FTP站点
3:设置ftp基本信息。路径为远程连接的工作路径 选取本机的IP地址,SSL如果不涉密可以选无。 这里权限先这样设置之后再修改,点击完成即可。 保存后在此后即可看到添加的ftp服务。可以这样开启多个。 4:注意 要想通过java程序连接FTP在这里我新建了一个FTP的用户,新建一个用户ftptest,密码:123456,如下所示 这里注意一定要把√取消掉确定完成新建,之后修改FTP服务器设置,添加这个特定用户。 点击创建的ftp名称—》ftp身份验证—》修改身份认证,禁止匿名身份 返回最开始的页面,添加刚才创建的用户,如果创建用户对勾选着可能添加不成功。 输入刚才新建的用户名和密码,完成 如何测试刚才新建的用户是否有效嘞有好多种方法常用的是CMD命令行和下面介绍的这种 打开我的电脑在最上面输入 ftp:/+FTP之前设置的IP地址 我的是ftp:/169.254.187.243回车 输入用户和密码即可登录
3:用java开发连接ftp
org.apache.common.io提供了对FTP的开发,引入以下依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
3.1:ftp工具类
连接ftp服务
public class FtpClient {
private final static Logger LOGGER = LoggerFactory.getLogger(FtpClient.class);
/**
* FTP服务地址
*/
private static String FTP_IP;
/**
* FTP端口号
*/
private static Integer FTP_PORT;
/**
* FTP用户名
*/
private static String FTP_USER;
/**
* FTP密码
*/
private static String FTP_PASSWORD;
/**
* FTP根路径
*/
private static String FTP_PATH;
/**
* 映射盘符
*/
private static String FTP_DRIVELETTER;
private static FTPClient ftpClient;
static {
try {
Properties properties = new Properties();
InputStream inputStream = FtpClient.class.getClassLoader().getResourceAsStream("ftp-config.properties");
properties.load(inputStream);
FTP_IP = properties.getProperty("FTP_IP");
FTP_PORT = Integer.valueOf(properties.getProperty("FTP_PORT"));
FTP_USER = properties.getProperty("FTP_USER");
FTP_PASSWORD = properties.getProperty("FTP_PASSWORD");
FTP_PATH = properties.getProperty("FTP_PATH");
FTP_DRIVELETTER = properties.getProperty("FTP_DRIVELETTER");
} catch (IOException e) {
e.printStackTrace();
}
}
public static FTPClient getFTPConnection() {
ftpClient = new FTPClient();
try {
//连接
ftpClient.connect(FtpClient.FTP_IP, FtpClient.FTP_PORT);
//设置编码
ftpClient.setControlEncoding("UTF-8");
//设置传输文件类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//登录
ftpClient.login(FtpClient.FTP_USER, FtpClient.FTP_PASSWORD);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
LOGGER.info("==============未连接到FTP,用户名或密码错误=================");
//拒绝连接
ftpClient.disconnect();
} else {
LOGGER.info("==============连接到FTP成功=================");
}
} catch (SocketException e) {
e.printStackTrace();
LOGGER.info("==============FTP的IP地址错误==============");
} catch (IOException e) {
e.printStackTrace();
LOGGER.info("==============FTP的端口错误==============");
}
return ftpClient;
}
public static void closeConnect() {
LOGGER.warn("关闭ftp服务器");
try {
if (ftpClient != null) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
ftp工具类,进行文件上传下载等操作
public class FTPUtils {
/**
* 上传单个文件到远程
*
* @param ftpPath 路径
* @param uploadFileName 文件名
* @param input 输入流
* @return
*/
public static boolean uploadFile(String ftpPath, String uploadFileName, InputStream input) {
boolean issuccess = false;
FTPClient ftpClient = null;
try {
ftpClient = FtpClient.getFTPConnection();
//切换到工作目录
if (!ftpClient.changeWorkingDirectory(ftpPath)) {
ftpClient.changeWorkingDirectory("/");
String[] dirs = ftpPath.split("/");
for (String dir : dirs) {
ftpClient.makeDirectory(dir);
ftpClient.changeWorkingDirectory(dir);
}
}
ftpClient.enterLocalPassiveMode();//工作模式被动
//文件写入 远程文件名;输入流
boolean storeFile = ftpClient.storeFile(uploadFileName, input);
if (!storeFile) {
return issuccess;
}
input.close();
ftpClient.logout();
issuccess = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return issuccess;
}
private String inputStreamToString(InputStream inputStream) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String oneLine = "";
try {
while ((oneLine = bufferedReader.readLine()) != null) {
stringBuffer.append(oneLine);
}
return stringBuffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
3.2:测试
数据写入成功
public static void main(String[] args) {
String str = "test";
final ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
FTPUtils.uploadFile("/remote", "test.txt", inputStream);
}
|