FTP简述
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。它需要依赖于FTP服务器(支持FTP协议的服务器就是FTP服务器)。其传输方式有两种:ASCII传输方式、二进制传输模式。
安装
在网上查了查,FTP的安装都是用命令安装,这就要求你的服务器有网络。如果是个人虚拟机没有网,可以修改网络模式为net模式,ip改为自动模式(Automatic)即可
1、确认是否安装
pgrep vsftpd
2017-09-27_181356.png
2、安装
yum install vsftpd
2017-09-27_181450.png
3、启动 停止 重启 卸载
systemctl start vsftpd.service#启动
systemctl status vsftpd.service#重启
systemctl stop vsftpd.service#停止
/sbin/service vsftpd start
/sbin/service vsftpd restart
/sbin/service vsftpd stop
rpm -e vsftpd# 卸载
2017-09-27_181726.png
4、关闭防火墙
service iptables stop
5、修改配置
在修改配置之前,我们先看看ftp有哪些配置,ftp的配置在/etc/vsftpd/下
vsftpd的配置,配置文件中限定了vsftpd用户连接控制配置。
(1):vsftpd.ftpusers:位于/etc/vsftpd目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。
(2):vsftpd.user_list:位于/etc/vsftpd目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。
(3):vsftpd.conf:位于/etc/vsftpd目录下。来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。
anonymous_enable=NO #禁止匿名
local_enable=YES #允许本地登录
write_enable=YES #允许写,如需上传,则必须
llocal_umask=027 #将上传文件的权限设置为:777-local_umask
anon_upload_enable=YES #允许虚拟用户和匿名用户上传
anon_other_write_enable=YES #允许虚拟用户和匿名用户修改文件名和删除文件
dirmessage_enable=YES
xferlog_enable=YES #打开日志记录
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log #日志存放位置
xferlog_std_format=YES #标准日志格式
idle_session_timeout=600 #空闲连接超时
data_connection_timeout=120
ftpd_banner=Welcome to ChinaRise FTP service #欢迎信息
chroot_local_user=NO
chroot_list_enable=YES
#以上两行将虚拟用户限制在其目录下,不能访问其他目录,或者直接用
chroot_local_user=YES
listen=yes #监听/被动模式
listen_port=21 #监听端口
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list #虚拟用户名单保存在文件/etc/vsftpd/vsftpd.chroot_list 中
user_config_dir=/etc/vsftpd/vsftpd_user_conf #每个虚拟用户名的更加详细的培植保存在/etc/vsftpd/vsftpd_user_conf 中
注意
这里ftpusers和user_list的限制用户列表,通常我们自己本地测试时都用root登陆,所以切记注掉这两个文件中的root(LZ在这被坑了许久)
6、设置selinux
vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
2017-09-27_182724.png
7、关闭selinux
setenforce 0
8、用winSPC链接
2017-09-27_183248.png这里注意,ftp默认有两个端口20和21,20端口为数据传输端口,21端口为链接控制端口
java操作ftp
准备jar包
commons-net-1.4.1.jar
jakarta-oro-2.0.8.jar
log4j-1.2.17.jar
FtpInfo.java
/**
* ClassName: FtpInfo
* @author lvfang
* @Desc: TODO
* @date 2017-9-27
*/
public class FtpInfo {
//主机ip、端口
private String host;
private Integer port;
//用户名、密码
private String username;
private String password;
//基础路径、 文件路径、 文件名
private String basePath;
private String filePath;
private String filename;
private String localPath;//下载后保存到本地的路径
public FtpInfo(){};
//连接对应构造函数
public FtpInfo(String host,Integer port,String username,String password){
this.host = host;
this.port = port;
this.username = username;
this.password = password;
};
//上传文件对应构造函数
public FtpInfo(String host,Integer port,String username,String password,String basePath,String filePath,String filename){
this.host = host;
this.port = port;
this.username = username;
this.password = password;
this.basePath = basePath;
this.filePath = filePath;
this.filename = filename;
};
//下载文件对应构造函数
public FtpInfo(String host,Integer port,String username,String password,String basePath,String filePath,String filename,String localPath){
this.host = host;
this.port = port;
this.username = username;
this.password = password;
this.basePath = basePath;
this.filePath = filePath;
this.filename = filename;
this.localPath = localPath;
};
//getter setter方法
}
FtpUtil.java
/**
* ClassName: FtpUtil
* @author lvfang
* @Desc: TODO
* @date 2017-9-28
*/
public class FtpUtil {
private static FTPClient ftp;
private static FtpInfo ftpInfo = null;
/**
* Description: 上传文件
*
* @param f.host
* FTP服务器hostname
* @param f.port
* FTP服务器端口
* @param f.username
* FTP登录账号
* @param f.password
* FTP登录密码
* @param f.basePath
* FTP服务器基础目录
* @param f.filePath
* FTP服务器文件存放路径。例如分日期存放:/2017/09/28。文件的路径为basePath+filePath
* @param f.filename
* 上传到FTP服务器上的文件名
* @param input
* 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(FtpInfo ftpInfo, InputStream input) {
boolean result = false;
ftp = new FTPClient();
try {
int reply;
ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
// 切换到上传目录
if (!ftp.changeWorkingDirectory(ftpInfo.getBasePath()
+ ftpInfo.getFilePath())) {
// 如果目录不存在创建目录
String[] dirs = ftpInfo.getFilePath().split("/");
String tempPath = ftpInfo.getBasePath();
for (String dir : dirs) {
if (null == dir || "".equals(dir))
continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
// 设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();//不加这一次会出现无法上传
// 上传文件
if (!ftp.storeFile(ftpInfo.getFilename(), input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* Description: 下载文件
*
* @param f.host
* FTP服务器hostname
* @param f.port
* FTP服务器端口
* @param f.username
* FTP登录账号
* @param f.password
* FTP登录密码
* @param f.basePath
* 基础路径
* @param f.filePath
* 文件路径
* @param fileName
* 要下载的文件名
* @param localPath
* 下载后保存到本地的路径
* @return
*/
public static boolean downloadFile(FtpInfo ftpInfo) {
boolean result = false;
ftp = new FTPClient();
try {
int reply;
ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(ftpInfo.getBasePath() + ftpInfo.getFilePath());// 转移到FTP服务器目录
ftp.setControlEncoding("GBK");
//ftp.enterLocalPassiveMode();//不加这一次会出现无法上传
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(ftpInfo.getFilename())) {
File localFile = new File(ftpInfo.getLocalPath() + "/"+ ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* 测试连接
*
* @param f.host、f.port、f.username、f.password
* @return
* @throws Exception
*/
public static boolean connectFtp(FtpInfo ftpInfo) throws Exception {
ftp = new FTPClient();
boolean flag = false;
int reply;
if (ftpInfo.getPort() == null) {
ftp.connect(ftpInfo.getHost(), 21);
} else {
ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());
}
ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return flag;
}
// 转入当前目录工作
// ftp.changeWorkingDirectory(ftpInfo.getBasePath()+ftpInfo.getFilePath());
flag = true;
return flag;
}
/**
* 关闭连接
*/
public static void closeFtp() {
if (ftp != null && ftp.isConnected()) {
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
// 测试连接
// FtpInfo ftpInfo = new
// FtpInfo("192.168.**.***",21,"root","密码");
// System.out.println(FtpUtil.connectFtp(ftpInfo));;
// 上传测试
// FileInputStream in=new FileInputStream(new File("D:\\03.png"));
// ftpInfo = new
// FtpInfo("192.168.**.***",21,"root","密码","/home/images","/2017/09/28","05.jpg");
// System.out.println(FtpUtil.uploadFile(ftpInfo, in));
// 下载
ftpInfo = new FtpInfo("192.168.**.***", 21, "root", "密码","/home/images", "/2017/09/28", "05.jpg", "d:/");
System.out.println(FtpUtil.downloadFile(ftpInfo));
}
}
2017-09-27_185757.png
相关文章:
http://blog.csdn.net/wantaway314/article/details/52584531
http://www.cnblogs.com/zc123/p/6394470.html
http://www.cnblogs.com/huzi007/p/4236150.html
网友评论