基于FTP协议的上传与下载
1.什么是FTP协议
FTP是一种可以用来在网络上传输文件的协议。它分为客户端和服务器端,通常用于从客户端把文件传输到服务器端或者从服务器端下载文件到客户端。FTP协议带有外传输控制信息的功能,可以使用户对传输进行控制。主要的工作流程是:先建立控制连接,认证用户身份,然后建立数据连接进行文件传输。FTP的进程和属进程各自有各自的作用,主进程负责交互,属进程负责具体的数据传输。
2、基于FTP协议的上传与下载文件
1、打开FTP服务器
2、创建访问FTP服务器的客户端
FTPClient ftpClient = new FTPClient();
3、通过客户端访问FTP服务器并且验证用户名密码
用户名和密码均正确才能正常访问FTP服务器
// 连接FTP服务器并验证用户名密码
ftpClient.connect("192.168.180.1", 21);
ftpClient.login("coco", "123456");
4、通过客户端访问服务器当前目录中的所有文件
SimpleDateFormat fmt=new SimpleDateFormat("yyyy年MM月dd日"); // 日期格式化显示
// 通过客户端访问服务器当前目录中的所有文件
FTPFile[] listFiles = ftpClient.listFiles();
for (FTPFile ftpFile : listFiles) {
System.out.println("文件名称" + ftpFile.getName());
Date createData = ftpFile.getTimestamp().getTime();
System.out.println("创建时间" + fmt.format(createData));
System.out.println("文件大小" + ftpFile.getSize()+"字节");
}
5.如果文件名称中包含中文乱码,则需要加入
String fileName=ftpFile.getName();
fileName=new String(fileName.getBytes(“iso-8859-1”),“gb2312”);
即
SimpleDateFormat fmt=new SimpleDateFormat("yyyy年MM月dd日"); // 日期格式化显示
// 通过客户端访问服务器当前目录中的所有文件
FTPFile[] listFiles = ftpClient.listFiles();
for (FTPFile ftpFile : listFiles) {
String fileName=ftpFile.getName();
// 处理中文乱码
fileName=new String(fileName.getBytes("iso-8859-1"),"gb2312");
System.out.println("文件名称" + fileName);
Date createData = ftpFile.getTimestamp().getTime();
System.out.println("创建时间" + fmt.format(createData));
System.out.println("文件大小" + ftpFile.getSize()+"字节");
}
6、访问服务器中指定目录中的内容
加入一个判定条件即可
boolean isChanged = ftpClient.changeWorkingDirectory("111");
// 获取当前目录中的所有文件
if(isChanged) {
SimpleDateFormat fmt=new SimpleDateFormat("yyyy年MM月dd日"); // 日期格式化显示
FTPFile[] listFiles = ftpClient.listFiles();
for (FTPFile ftpFile : listFiles) {
String fileName=ftpFile.getName();
fileName=new String(fileName.getBytes("iso-8859-1"),"gb2312");
System.out.println("文件名称" + fileName);
Date createData = ftpFile.getTimestamp().getTime();
System.out.println("创建时间" + fmt.format(createData));
System.out.println("文件大小" + ftpFile.getSize()+"kb");
}
}else {
// 如果指定目录不存在,则创建
ftpClient.makeDirectory("111");
}
7、文件上传至FTP服务器的指定目录
FTPClient ftpClient = new FTPClient();
try (FileInputStream in = new FileInputStream("E:\\APESOURCE\\image\\day08\\2.jpg")) {
// 1.连接FTP服务器并检验用户名密码
ftpClient.connect("192.168.254.175", 21);
ftpClient.login("coco", "123456");
// 2.切换至个目录
boolean isChange = ftpClient.changeWorkingDirectory("oo");
if (!isChange) {
// 创建目录
ftpClient.makeDirectory("oo");
// 切换个人目录
ftpClient.changeWorkingDirectory("oo");
}
// 文件上传
// 设置文件的类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 存文件至FTP服务器
// 参数1:FTP文件的保存名称
// 参数2:本地文件输入流
boolean isStore = ftpClient.storeFile(System.currentTimeMillis() + ".jpg", in);
System.out.println("文件上传成功" + isStore);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
8.从FTP服务器下载指定文件
FTPClient ftpClient=new FTPClient();
try(FileOutputStream out=new FileOutputStream("E:\\APESOURCE\\image"+System.currentTimeMillis()+".jpg")){
ftpClient.connect("192.168.254.175",21);
ftpClient.login("coco", "123456");
// 切换至个人目录
boolean isChange=ftpClient.changeWorkingDirectory("liubin");
// 下载指定文件
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 文件类型
boolean isRetrieve=ftpClient.retrieveFile("3.jpg", out);
System.out.println("下载成功?"+isRetrieve);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
// 断开连接
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}