首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd  -v。如果出现以下信息,那么就说明已经安装vsftpd

如果没有安装,那么输入命令   : yum  install vsftpd -y 进行安装,出现complete说明安装成功。

现在去我们先创建一下用户 , 命令:useradd  -d /home/ftpuser ftpuser   -d是为用户ftpuser 指定主目录,默认是/home下对应用户名的一个文件夹。

接着设置用户密码 : passwd ftpuser .输入两次以后显示successfully就说明设置好了。

接着我们需要查看一下本机外网访问权限,这个一定要开。不然会执行失败:输入 getsebool -a |grep ftp

我们发现这两个状态是关着的,我们要把他开起来,同事也要关闭防火墙

这样子就开起来了。接下去我们需要配置一下vsftpd 的配置文件 进入配置文件目录

其实默认的配置文件就可以满足基本的功能,如果我们需要关闭匿名操作,那么我们把anonymous_enable设置为NO就可以了。

vsftpd的默认端口为21,在不太了解vsftpd的情况下,切记不要去改他。一定不要去改,一定不要!!

接下去就是JAVA代码了

上传功能的代码:上传过程可能遇到进入文件夹失败,这里推荐大家用绝对路径!!!

/**
* 初始化ftp服务器
*
* @throws IOException
* @throws SocketException
*/
public void initFtpClient() throws SocketException, IOException {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
LOGGER.info("connecting...ftp服务器:" + this.hostname + ":" + this.port);
ftpClient.connect(hostname, port); // 连接ftp服务器
ftpClient.login(username, password); // 登录ftp服务器
int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
LOGGER.info("connect failed...ftp服务器:" + this.hostname + ":" + this.port);
}
LOGGER.info("connect successfu...ftp服务器:" + this.hostname + ":" + this.port); } /**
* 上传文件
*
* @param pathname
* ftp服务保存地址
* @param fileName
* 上传到ftp的文件名
* @param inputStream
* 输入文件流
* @return
* @throws IOException
*/
public boolean uploadFile(String pathname, String fileName, InputStream inputStream) throws IOException {
boolean flag = false;
initFtpClient();
try {
LOGGER.info("开始上传文件");
ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
// CreateDirecroty(pathname); boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory(pathname);
if(changeWorkingDirectory) {
LOGGER.info("进入文件"+pathname+"夹成功.");
}else {
LOGGER.info("进入文件"+pathname+"夹失败.开始创建文件夹");
boolean makeDirectory = ftpClient.makeDirectory(pathname);
if(makeDirectory) {
LOGGER.info("创建文件夹"+pathname+"成功");
boolean changeWorkingDirectory2 = ftpClient.changeWorkingDirectory(pathname);
if(changeWorkingDirectory2) {
LOGGER.info("进入文件"+pathname+"夹成功.");
}
}else {
LOGGER.info("创建文件夹"+pathname+"失败");
}
}
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
if (flag) { LOGGER.info("上传文件成功");
}
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
} 

接下去就是上传的功能了,我这里约到一个很奇怪的现象,就是通过ftpclientd获取文件列表的时候有随机性,有时候可以获取到,有时候却是空的,就是ftpclient.listFiles()方法。网上的说法是添加方法ftpClient.enterLocalPassiveMode();,可是我这里添加了这个方法就连接超时。也有人说是防火墙一系列问题。那么首先是vsftpd的主动被动问题。vsftpd的配置文件是默认启用的主动模式。要改成被动模式的话,这边需要修改配置文件,我用的主动模式 。输入命令 vim /etc/vsftpd/vsftpd.conf  ,修改之前记得先备份一份配置文件。 然后:

这么改,启动被动模式,关闭主动模式,随后重启vsftpd.我试过仅仅这样子改是不行的,我们需要去查看一下SELinux防火墙的状态:

我这里是宽容模式。SELinux有3种状态,Permissive (宽容模式), Disabled , Enforcing(强制)在配置文件/etc/selinux/config中定义,要永久关闭SELinux防火墙需要将SELINUX=Permissive改为SELINUX=disabled,这里一定要重启系统。如果是启用就将disabled改成其他的,也需要重启。我这边是强制改成宽容,只需要输入命令setenforce 1 就可以了,不需要重启计算机。修改完这里,我们还要设置防火墙FireWall防火墙。

firewall-cmd --permanent --zone=public --add-port=10090-10100/tcp

firewall-cmd --reload

显示success就可以了。。。

接下去要增加两个模块。。不然被动模式会连接失败,编辑  /etc/sysconfig/iptables-config  文件

IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"

添加完这两行 保存设置  firewall-cmd --reload 。

这里的配置有乱,我后来把防火墙也禁用了。SELinux也禁用了。

可能根本不需要这些配置,大家在实操的时候可以先把防火墙跟SELinux都先禁用。看看实际运行情况再考虑要不要做这些配置,我这里是遇到获取不到文件。所以百度了很多文章,做了很多配置,毕竟不熟悉。

接下去就是下载 跟 删除的代码了:

/**
* * 下载文件 *
*
* @param pathname
* FTP服务器文件目录 *
* @param filename
* 文件名称 *
* @param localpath
* 下载后的文件路径 *
* @return
* @throws IOException
*/
public byte[] downloadFile(String pathname, String filename, String localpath) throws IOException {
boolean flag = false;
OutputStream os = null;
byte[] buffer = null;
initFtpClient();
try {
LOGGER.info("开始下载文件");
// ftpClient.enterLocalPassiveMode();
// FTPClientConfig conf = new FTPClientConfig( FTPClientConfig.SYST_UNIX);
// ftpClient.configure(conf);
// 切换FTP目录
boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory(pathname);
if(!changeWorkingDirectory) {
throw new FTPTransferException(FTPError.changeDirectoryError) ;
}else {
LOGGER.info("进入目"+pathname+"录成功。");
} FTPFile[] ftpFiles = ftpClient.listFiles(pathname, new FTPFileFilter() { @Override
public boolean accept(FTPFile file) {
if (file.getName().equals(filename)) {
return true;
}
return false;
}
});
for (int i=0;i<ftpFiles.length && flag ==false;i++) {
FTPFile file = ftpFiles[i];
if (filename.equalsIgnoreCase(file.getName())) {
flag = true;
setFileSize(file.getSize());
InputStream fis = ftpClient.retrieveFileStream(file.getName());
buffer = new byte[fis.available()];
int read = fis.read(buffer);
fis.close();
LOGGER.info("下载文件成功");
}
}
ftpClient.logout(); } finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer;
} /**
* * 删除文件 *
*
* @param pathname
* FTP服务器保存目录 *
* @param filename
* 要删除的文件名称 *
* @return
* @throws IOException
*/
public boolean deleteFile(String pathname, String filename) throws IOException {
boolean flag = false;
try {
LOGGER.info("开始删除文件");
initFtpClient();
// 切换FTP目录
boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory(pathname);
if(!changeWorkingDirectory) {
throw new FTPTransferException(FTPError.changeDirectoryError) ;
}else {
LOGGER.info("进入目"+pathname+"录成功。");
} FTPFile[] ftpFiles = ftpClient.listFiles(pathname, new FTPFileFilter() { @Override
public boolean accept(FTPFile file) {
if (file.getName().equals(filename)) {
return true;
}
return false;
}
});
if (ftpFiles == null || ftpFiles.length == 0) {
LOGGER.info("删除文件失败,文件不存在");
throw new FTPTransferException(FTPError.fileNotFound) ;
} else { ftpClient.dele(filename);
ftpClient.logout();
flag = true;
}
if(flag) { LOGGER.info("删除文件成功");
}
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}

这样下来基本功能就差不多都可以实现了。。经过验证,获取不到列表的我,应该不是主动被动的关系,到最后我还是改成了主动,最终确定是SELinux的锅,一定把他的强制模式关闭。在调试前,一定要看看SELinux的状态,跟防火墙的状态。都给他关了 排除干扰,一般来说程序就没什么问题了

Linux下vsftpd的安装,Java上传文件实现。的更多相关文章

  1. linux下vsftpd的安装及配置使用详细步骤(推荐)

    vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux.BS ...

  2. https 协议下服务器根据网络地址下载上传文件问题

    https 协议下服务器根据网络地址下载上传文件遇到(PKIX:unable to find valid certification path to requested target 的问题) 使用h ...

  3. Java上传文件FTP服务器代码

    1. 在实际的应用重,通常是通过程序来进行文件的上传. 2. 实现java上传文件到ftp服务器中 新建maven项目 添加依赖 <dependency> <groupId>c ...

  4. java 上传文件到 ftp 服务器

    1.  java 上传文件到 ftp 服务器 package com.taotao.common.utils; import java.io.File; import java.io.FileInpu ...

  5. Linux 下 maven 的下载、上传与安装

    要运行maven,必须要有 JDK ,maven 是由 Java 语言编写的 一.JDK 的安装 ORACLE 官网下载JDK jdk-8u231-linux-x64.tar.gz 上传 JDK 至 ...

  6. Linux系统通过AWS命令行上传文件至S3

    打开你的AWS控制台: 在IAM中创建一个新用户(比如test),创建时它会自动创建一个用户安全凭证,是由“访问密钥ID”和“私有访问密钥”组成的,请记住它并下载该凭证,后面会用到它: 选择你刚创建的 ...

  7. java+上传+文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素:   1.表单提交方式:post (get方式提交有 ...

  8. java+上传文件夹

    最近在学习百度的开源上传组件WebUploader,写了一些示例以记录.WebUploader的缺点是没有一个比较好的现成的界面,这个界面需要自己去实现.自由度高了一些. WebUploader是由B ...

  9. java上传文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...

随机推荐

  1. webpack设置热更新

    首先需要在package.json中配置一个脚本参数 --hot "dev": "webpack-dev-server --mode development --hot& ...

  2. MySQL数据库的版本更新方法

    MySQL数据库的版本更新很快,新的特性也随之不断的更新,更主要的是解决了很多影响我们应用的BUG,为了让我们的MySQL变得更美好,我们有必要去给它升级,尽管你会说它现在已经跑得很好很稳定完全够用了 ...

  3. P2P的原理和常见的实现方式

    参考资料:http://www.cppblog.com/peakflys/archive/2013/01/25/197562.html P2P实现的原理 首先先介绍一些基本概念:    NAT(Net ...

  4. mouseover,mouseout与mouseenter,mouseleave

    针对单个元素,使用感一样. 差异提现在有子元素的情况下: mouseover和mouseout在父元素和其子元素都可以触发,当鼠标穿过一个元素时,触发次数得依子元素数量而言. mouseenter和m ...

  5. lambda、pair、智能指针及时间函数

    Lambda 表达式 auto f1 = [](int x, int y) { return x + y; };cout << f1(2, 3) << endl; int n ...

  6. 【深入分析Java Web技术内幕】2、深入分析Java I/O的工作机制

    Java的I/O类库的基本架构 基于字节操作的IO接口:InputStream.OutputStream 基于字符操作的IO接口:Writer.Reader 基于磁盘操作的IO接口:File 基于网络 ...

  7. 自定义Banner

    Spring Boot项目启动时,默认的打印样式如下 自定义 在/src/main/resources目录下新建banner.txt,在里面输入要打印的文字即可,例如: 图形制作网站:http://w ...

  8. Log4Net配置日志

    1.log4net 1)新建一个Net空白项目,在引用出点击管理NuGet程序包,搜索log4net并安装 2)建立log4net.config配置文件 在configuration里面添加如下代码, ...

  9. 对象转换为json格式,类似中间层API

    <一头扎进SpringMvc视频教程\<一头扎进SpringMvc>第四讲 源码\> 对象自动转换为json格式要在 spring-mvc.xml添加一个东西 ,和对应的命名空 ...

  10. linux 软件包管理介绍