FTP服务之Java操作FTP服务器下载文件的两种方式
文章目录
注意:如果fpt服务中没有建立目录, 则默认文件目录为根目录也即
/
,否则按具体目录进行操作,如:/demo
FTP服务搭建查看博文 FTP服务之WindowsServer2019中搭建私有FTP服务器
1. 使用Apache commons-net工具包
1. 引入commons-net依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.10.0</version>
</dependency>
2. 操作案例
1. 单文件下载
@Test
public void downLoadOne() {
String server = "192.168.31.252";
int port = 21;
String user = "anonymous";
String password = "";
String remoteFile = "/demo/xxx说明书.pdf";
String localFile = "F:\\ftpDownlaod\\newAAA.pdf";
FTPClient ftpClient = new FTPClient();
OutputStream outputStream = null;
try {
ftpClient.connect(server, port);
ftpClient.login(user, password);
ftpClient.enterLocalPassiveMode();
outputStream = Files.newOutputStream(Paths.get(localFile));
// ftp默认使用ISO-8859-1编码格式,所以这里需要转换为ISO-8859-1,“解决文件名为中文时,下载后为空文件的问题”
String remoteFileName = new String(remoteFile.getBytes("GBK"), StandardCharsets.ISO_8859_1);
ftpClient.retrieveFile(remoteFileName, outputStream);
} catch (IOException ex) {
System.out.println("DownLoad Error: " + ex.getMessage());
ex.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
ftpClient.disconnect();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
2. 切换到指定目录批量下载文件
@Test
public void batchDownLoadFileFromFtp() {
FTPClient client = new FTPClient();
try {
//设置主机与端口
client.connect("192.168.31.252", 21);
//设置用户名及密码,这里以匿名用户登录为例,根据需求改为自己的用户名及密码
client.login("anonymous", "");
System.out.println("FTP服务器文件编码===>>" + client.getControlEncoding());
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
System.out.println("Login Error,Please check if your username or password is correct");
return;
}
client.setControlEncoding("GBK");
System.out.println("设置后的文件编码:" + client.getControlEncoding());
client.enterLocalPassiveMode();
//切换到demo目录下
client.changeWorkingDirectory("demo");
System.out.println("---------------------------------------");
String[] names;
names = client.listNames();
for (String name : names) {
System.out.println(name);
}
System.out.println("ftp服务中,demo目录中的所有文件:" + Arrays.toString(names));
System.out.println("---------------------------------------");
FTPFile f = client.listFiles()[0];
System.out.println("getLink===>" + f.getLink());
//切换到根目录下
client.changeWorkingDirectory("/");
String path = "/demo";
client.setBufferSize(1024);
client.setFileType(FTP.BINARY_FILE_TYPE);
client.enterLocalPassiveMode();
//切换到demo目录下获取此目录中所有的文件,并进行一个下载
client.changeWorkingDirectory(path);
FTPFile[] fs = client.listFiles();
for (FTPFile ff : fs) {
String outFileName = ff.getName();
System.out.println(outFileName);
//本地目录文件不需要编码
File localFile = new File("F:\\ftpDownlaod\\" + ff.getName());
OutputStream fos = Files.newOutputStream(localFile.toPath());
// ftp默认使用ISO-8859-1编码格式,所以这里需要转换为ISO-8859-1,“解决文件名为中文时,下载后为空文件的问题”
String localFileName = new String(ff.getName().getBytes("GBK"), StandardCharsets.ISO_8859_1);
client.retrieveFile(localFileName, fos);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 使用Hutool工具
Hutool对FTP客户端基于Apache Commons Net做了进一步的封装。
1. 引入依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
2. 操作案例
1. 文件下载
目前存在的问题: 如果文件名称是中文,则下载后的文件大小为0
@Test
public void ftpServerTestByAnonymousOne() {
Ftp ftp = new Ftp("192.168.31.252", 21);
String downLoadPath = "/demo";
String fileName = "demo.pdf";
String outputPath = "F:\\ftpDownlaod";
ftp.download(downLoadPath, fileName, new File(outputPath));
//关闭连接
try {
ftp.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//FtpUtil.downloadFile(host, port, user, password, remotePath, localPath);
}
@Test
public void ftpServerTestByAnonymousTwo() throws UnsupportedEncodingException {
Ftp ftp = new Ftp("192.168.31.252", 21, "anonymous", "", StandardCharsets.UTF_8);
String downLoadPath = "/demo";
String fileName = "数据迁移最佳实践.pdf";
//String remoteFileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
String outputPath = "F:\\ftpDownlaod\\xxx.pdf";
ftp.download(downLoadPath, fileName, new File(outputPath));
//关闭连接
try {
ftp.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//FtpUtil.downloadFile(host, port, user, password, remotePath, localPath);
}