Linux下vsftpd的安装,Java上传文件实现。
首先我们需要查看是否已经安装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上传文件实现。相关推荐
- linux sftp 上传文件内容为空,求linux 下 C/c++ 实现SFTP上传文件的代码,或shell 写的如何区分上传是否成功?...
如题求linux系统下C/C++实现SFTP上传文件的代码,最好有一定的中文注释,谢谢了. 或是, 我看FTP上传的shell写的比较简单,但是,如何能判断是否上传成功哪?? 如果想做上传的进度条的话 ...
- ftp linux 推送文件_Linux下SSH用FTP命令上传文件至另一个FTP空间
如果没有ftp 提示: -bash: ftp: command not found 请先安装ftp应用程序: yum install ftp #ftp 127.0.0.1 21 输入远程空间的FTP ...
- java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能
Java远程连接Linux服务器并执行命令及上传文件功能 发布于 2020-3-6| 复制链接 摘记: 最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记.此种连接方法中有考虑到并 ...
- Linux使用SSH上传下载文件,Linux下通过ssh scp命令上传下载文件
Linux下通过ssh scp命令上传下载文件. 1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 例如 scp /var/tale ...
- Linux 通过命令行下载、上传文件到百度网盘(bypy)
文章目录 安装配置 上传文件 下载文件 其他用法 使用的工具是bypy,github项目地址:https://github.com/houtianze/bypy 安装配置 首先安装bypy: pip3 ...
- java上传文件到服务器,java上传文件到云服务器
java上传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...
- java上传文件功能_Java MemoryMapped文件的功能
java上传文件功能 Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取. 内存映射文件可 ...
- Java上传文件到minio
Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能.而且学习成本低,安装运维简单,开箱即用,提供 Java 客 ...
- Java上传文件到数据库
Java上传文件到数据库 首先在开始本文之前推荐一篇我非常喜欢的博主--孤傲苍狼的一篇相关博文. JavaWeb学习总结(五十)--文件上传和下载 http://www.cnblogs.com/xdp ...
- java 上传文件注意事项
java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...
最新文章
- python之XML文件解析
- Android Studio 运行、编译卡死的解决办法
- 如何解决 SQL Server 2000 中的连接问题
- 文件服务器安全,文件服务器安全
- [转]Android输入法框的梳理
- 小甲鱼 OllyDbg 教程系列 (十四) : 模态对话框 和 非模态对话框 之 URlegal 和 movgear
- python list tuple 消耗_Python内存消耗:dict VS元组列表
- 使用Docker搭建hadoop集群
- Golang sync.Map 简介与用法
- spark 算子使用类变量_SparkCore的常用算子
- VS C# string 字符包含判断
- 网络口碑营销从“可以做”、“值得做”到了“必须做好”的阶段!
- 如何把信息做成二维码?如何制作二维码的内容?
- 对前端页面的边框设置
- C语言回车符号和换行符
- spring获取Bean报错
- 拼多多这样来挑选关键词|百择电商
- 诺贝尔奖得主费曼大神教你如何学习
- java二重循环_java二重循环
- 关于虚拟机中linux系统时间的问题
热门文章
- 汇编学习--7.10--程序编写
- Python-英文小说词频统计
- 2008域控服务器创建本地用户,windows 2008 r2 用域帐户登陆后怎么修改本地用户密码?...
- android wear系统源码,android wear5.1怎么样 android wear5.1更新评测
- 远程访问服务器并登录LPAR,MySQL设置远程连接服务器
- 计算机加域成灰色,高手解说win7系统创建域选项变成灰色的具体教程
- 归并排序的时间复杂度
- elasticsearch 之index API
- [Manifest]关于version
- Retrofit2源码解析(一)