原文:https://blog.csdn.net/java2000_net/article/details/3718852
- 需要用到的jar是
<!-- FTP -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
- 具体代码如下
package com.utils;
import org.apache.commons.net.ftp.FTPClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
* @Author: YafengLiang
* @Description:
* @Date: Created in 16:40 2018/12/5
*/
public class FtpTest {
private static final Logger logger = LoggerFactory.getLogger(FtpTest.class);
static FTPClient ftpClient;
final static String HOST="192.168.6.88";
final static int PORT=21;
final static String USERNAME="user1";
final static String PASSWORD="voicecyber@123";
final static String LOCAL_DIRECTORY="F:/voicecyber/";
public static void login() throws IOException{
ftpClient = new FTPClient();
ftpClient.connect(HOST,PORT);
ftpClient.login(USERNAME, PASSWORD);
//设置编码
ftpClient.setControlEncoding("GBK");
ftpClient.setBufferSize(8096);
}
/**
* 判断给定的路径是文件还是文件夹
* @param path
* @return
* @throws IOException
*/
public static boolean isDirectory(String path) throws IOException{
//如果是文件,就会返回false
//如果文件夹或文件名中含有中文,这里要转换一下,不然会返回false
return ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
}
/**
* 判断本地路径是否存在,不存在就创建路径
* @param path
*/
public static void makeDirs(String path){
File localFile = new File(LOCAL_DIRECTORY+path);
if(!localFile.exists()){
localFile.mkdirs();
}
}
/**
* 下载单个文件
* @param dir
* @throws IOException
*/
public static void downloadFile(String dir) throws IOException{
File file = new File(LOCAL_DIRECTORY + dir);
OutputStream os = new FileOutputStream(file);
ftpClient.setControlEncoding("GBK");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//如果文件名中含有中文,retrieveFile文件时会找不到FTP上的文件,导致保存在本地的是一个空文件,所以也要转换一下
ftpClient.retrieveFile(new String(file.getName().getBytes(),"ISO-8859-1"), os);
os.close();
}
/**
* 下载任务,递归调用,循环下载所有目录下的文件
* @param path
* @throws IOException
*/
public static void doDownload(String path) throws IOException{
//创建本地目录
makeDirs(path);
//切换工作目录
ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));
//获取目录下的文件列表
String[] fileNames = ftpClient.listNames();
//循环下载FTP目录下的文件
for(String fname:fileNames){
if(isDirectory(path+"/"+fname)){
//递归调用
doDownload(path+"/"+fname);
}else{
//下载单个文件
downloadFile(path+"/"+fname);
}
}
}
/**
* 实时同步ftp目录文件到本地
*/
public static class MyRun implements Runnable{
@Override
public void run() {
while(true){
try {
Thread.sleep(10*1000);
logger.info("休息十秒。。。。。。");
doDownload("/");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
//连接FTP服务器
login();
//全目录下载
MyRun myRun = new MyRun();
new Thread(myRun).start();
//testUpload();
}
/**
* ftp上传
*/
public static void testUpload() {
FTPClient ftpClient = new FTPClient();
FileInputStream fis = null;
try {
ftpClient.connect("172.20.16.76",9500);
ftpClient.login("lyc", "123456");
JFileChooser fd = new JFileChooser();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(fd);
fd.showOpenDialog(null);
File srcFile = fd.getSelectedFile();
//if(srcFile != null){}
fis = new FileInputStream(srcFile);
//设置上传目录
ftpClient.changeWorkingDirectory("/img");
//ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(srcFile.getName(), fis);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("FTP客户端出错!", e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("关闭FTP连接发生异常!", e);
}
}
}
}