首先我们需要查看是否已经安装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() {@Overridepublic 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() {@Overridepublic 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的状态,跟防火墙的状态。都给他关了 排除干扰,一般来说程序就没什么问题了

转载于:https://www.cnblogs.com/wuzhenzhao/p/9181708.html

Linux下vsftpd的安装,Java上传文件实现。相关推荐

  1. linux sftp 上传文件内容为空,求linux 下 C/c++ 实现SFTP上传文件的代码,或shell 写的如何区分上传是否成功?...

    如题求linux系统下C/C++实现SFTP上传文件的代码,最好有一定的中文注释,谢谢了. 或是, 我看FTP上传的shell写的比较简单,但是,如何能判断是否上传成功哪?? 如果想做上传的进度条的话 ...

  2. ftp linux 推送文件_Linux下SSH用FTP命令上传文件至另一个FTP空间

    如果没有ftp 提示: -bash: ftp: command not found 请先安装ftp应用程序: yum install ftp #ftp 127.0.0.1 21 输入远程空间的FTP ...

  3. java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能

    Java远程连接Linux服务器并执行命令及上传文件功能 发布于 2020-3-6| 复制链接 摘记:  最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记.此种连接方法中有考虑到并 ...

  4. Linux使用SSH上传下载文件,Linux下通过ssh scp命令上传下载文件

    Linux下通过ssh scp命令上传下载文件. 1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 例如 scp /var/tale ...

  5. Linux 通过命令行下载、上传文件到百度网盘(bypy)

    文章目录 安装配置 上传文件 下载文件 其他用法 使用的工具是bypy,github项目地址:https://github.com/houtianze/bypy 安装配置 首先安装bypy: pip3 ...

  6. java上传文件到服务器,java上传文件到云服务器

    java上传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...

  7. java上传文件功能_Java MemoryMapped文件的功能

    java上传文件功能 Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取. 内存映射文件可 ...

  8. Java上传文件到minio

    Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能.而且学习成本低,安装运维简单,开箱即用,提供 Java 客 ...

  9. Java上传文件到数据库

    Java上传文件到数据库 首先在开始本文之前推荐一篇我非常喜欢的博主--孤傲苍狼的一篇相关博文. JavaWeb学习总结(五十)--文件上传和下载 http://www.cnblogs.com/xdp ...

  10. java 上传文件注意事项

    java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...

最新文章

  1. python之XML文件解析
  2. Android Studio 运行、编译卡死的解决办法
  3. 如何解决 SQL Server 2000 中的连接问题
  4. 文件服务器安全,文件服务器安全
  5. [转]Android输入法框的梳理
  6. 小甲鱼 OllyDbg 教程系列 (十四) : 模态对话框 和 非模态对话框 之 URlegal 和 movgear
  7. python list tuple 消耗_Python内存消耗:dict VS元组列表
  8. 使用Docker搭建hadoop集群
  9. Golang sync.Map 简介与用法
  10. spark 算子使用类变量_SparkCore的常用算子
  11. VS C# string 字符包含判断
  12. 网络口碑营销从“可以做”、“值得做”到了“必须做好”的阶段!
  13. 如何把信息做成二维码?如何制作二维码的内容?
  14. 对前端页面的边框设置
  15. C语言回车符号和换行符
  16. spring获取Bean报错
  17. 拼多多这样来挑选关键词|百择电商
  18. 诺贝尔奖得主费曼大神教你如何学习
  19. java二重循环_java二重循环
  20. 关于虚拟机中linux系统时间的问题

热门文章

  1. 汇编学习--7.10--程序编写
  2. Python-英文小说词频统计
  3. 2008域控服务器创建本地用户,windows 2008 r2 用域帐户登陆后怎么修改本地用户密码?...
  4. android wear系统源码,android wear5.1怎么样 android wear5.1更新评测
  5. 远程访问服务器并登录LPAR,MySQL设置远程连接服务器
  6. 计算机加域成灰色,高手解说win7系统创建域选项变成灰色的具体教程
  7. 归并排序的时间复杂度
  8. elasticsearch 之index API
  9. [Manifest]关于version
  10. Retrofit2源码解析(一)