Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能。Apache FtpServer 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring 相集成的模块。
用户管理主要对于FTP的用户进行管理,包括用户名,用户密码,用户的根目录,用户的写权限,登陆超时,最大连接数,最多连接ip数,上传速度,下载速度。
Apache Ftp Server 提供多种方式的用户注册:文件、URL、数据库、手动注册等
Apache FtpServer下载地址:http://mina.apache.org/ftpserver-project/index.html
解压后在apache-ftpserver-1.1.1\common\lib文件夹中添加需要的jar包
public static void main(String[] args) throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory();
FtpServer server = serverFactory.createServer();
server.start();
}
PS:运行程序,启动FTP服务器后,在地址栏中输入ftp://localhost,因为它是最简单的FTP服务器,没有配置用户,所以无法登陆进去。
public static void main(String[] args) throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory();
BaseUser user = new BaseUser();
user.setName("anonymous"); //用户名
user.setPassword("123456"); //如果没有这行代码,则为匿名用户
user.setHomeDirectory("D:/test"); //登陆时的路径
serverFactory.getUserManager().save(user); //加入这个用户
FtpServer server = serverFactory.createServer();
server.start();
}
PS:但是此时的FTP权限是只读的,也就是只能查看文件,但是不能增删改。
public static void main(String[] args) throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory();
BaseUser user = new BaseUser();
user.setName("anonymous");
user.setHomeDirectory("D:/test");
List authorities = new ArrayList();
authorities.add(new WritePermission()); //添加读写权限
user.setAuthorities(authorities);
serverFactory.getUserManager().save(user);
FtpServer server = serverFactory.createServer();
server.start();
}
文件注册用户是最常用,也是用的最多的方式,你可以通过配置users.properties来实现。
users.properties:
//用户的根目录
ftpserver.user.admin.homedirectory=/ftproot
//用户的密码,是加密过的密码(加密方式有2种,MD5和SHA)
ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
//用户是否有效
ftpserver.user.admin.enableflag=true
//用户的写权限
ftpserver.user.admin.writepermission=true
//用户的超时时间
ftpserver.user.admin.idletime=0
//用户的最大登陆数
ftpserver.user.admin.maxloginnumber=0
//用户的最大ip连接数
ftpserver.user.admin.maxloginperip=0
//上传速度
ftpserver.user.admin.uploadrate=0
//下载速度
ftpserver.user.admin.downloadrate=0
加载:
public static void main(String[] args) throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory();
PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
userManagerFactory.setFile(new File("users.properties"));
serverFactory.setUserManager(userManagerFactory.createUserManager());
FtpServer server = serverFactory.createServer();
server.start();
}
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 authorities = new ArrayList();
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();
}
}
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 authorities = new ArrayList();
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;
}
}