1、简介
Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能。Apache FtpServer 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring 相集成的模块。
用户管理主要对于FTP的用户进行管理,包括用户名,用户密码,用户的根目录,用户的写权限,登陆超时,最大连接数,最多连接ip数,上传速度,下载速度。
Apache Ftp Server 提供多种方式的用户注册:文件、URL、数据库、手动注册等
2、使用
- .添加maven依赖
<!--ftp-->
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version>1.1.1</version>
<scope>compile</scope>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
- 代码实现
public static void main(String[] args) throws FtpException {
FtpServer ftpServer;
int PORT = 8888;
String USERNAME = "admin";
String PASSWORD = "123456";
String nvis_root="E:\\FTPServerPath";
try {
// 用于创建server
FtpServerFactory serverFactory = new FtpServerFactory();
// 配置信息,如设监听的端口,设置IP过滤器
ListenerFactory listenerFactory = new ListenerFactory();
// 设置端口
listenerFactory.setPort(PORT);
// 如果五分钟还没任何操作,关闭连接
// listenerFactory.setIdleTimeout(5*60*1000);
// 设置匿名用户 但是对于稳健权限是只读
// 设置用户名密码
BaseUser user = new BaseUser();
user.setName(USERNAME);
user.setPassword(PASSWORD);
// 设置PC端登录后可访问的根目录
user.setHomeDirectory(nvis_root);
// 授予用户写权限
List<Authority> authorities = new ArrayList<Authority>();
authorities.add(new WritePermission());
user.setAuthorities(authorities);
serverFactory.getUserManager().save(user);
// 创建并监听网络
serverFactory.addListener("default", listenerFactory.createListener());
// 创建服务
ftpServer = serverFactory.createServer();
// 开启服务
ftpServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
启动项目访问 ftp://localhoast:8888,输入账号密码
也可使用ftp工具进行连接,进行拖拽上传的使用
3、工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.WritePermission;
public class FavFTPUtil {
public static void startServer() {
FtpServer ftpServer;
int PORT = "";
String USERNAME = "";
String PASSWORD = "";
String nvis_root="";
try {
// 用于创建server
FtpServerFactory serverFactory = new FtpServerFactory();
// 配置信息,如设监听的端口,设置IP过滤器
ListenerFactory listenerFactory = new ListenerFactory();
// 设置端口
listenerFactory.setPort(PORT);
// 如果五分钟还没任何操作,关闭连接
// listenerFactory.setIdleTimeout(5*60*1000);
// 设置匿名用户 但是对于稳健权限是只读
// 设置用户名密码
BaseUser user = new BaseUser();
user.setName(USERNAME);
user.setPassword(PASSWORD);
// 设置PC端登录后可访问的根目录
user.setHomeDirectory(nvis_root);
// 授予用户写权限
List<Authority> authorities = new ArrayList<Authority>();
authorities.add(new WritePermission());
user.setAuthorities(authorities);
serverFactory.getUserManager().save(user);
// 创建并监听网络
serverFactory.addListener("default", listenerFactory.createListener());
// 创建服务
ftpServer = serverFactory.createServer();
// 开启服务
ftpServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private String intToIp(int i) {
return (i & 0xFF)+"."+((i >> 8) & 0xFF)+"."+((i >> 16) & 0xFF)+"."+(i >> 24 & 0xFF);
}
/**
* 上传文件(可供Action/Controller层使用)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param fileName 上传到FTP服务器后的文件名称
* @param inputStream 输入文件流
* @return
*/
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//是否成功登录FTP服务器
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 上传文件(可对文件进行重命名)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 上传到FTP服务器后的文件名称
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
boolean flag = false;
try {
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 上传文件(不可以进行文件的重命名操作)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
boolean flag = false;
try {
String fileName = new File(originfilename).getName();
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 删除文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 要删除的文件名称
* @return
*/
public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
/**
* 下载文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器文件目录
* @param filename 文件名称
* @param localpath 下载后的文件路径
* @return
*/
public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
File localFile = new File(localpath + "/" + file.getName());
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
}