Java怎么玩转FTP服务

100 阅读3分钟

      之前研究过FastDFS尝试做一个文件服务,但是感觉FastDFS过于沉重,所以后面换了一个。既然是文件服务,你不得不想起一个老古董——FTP。别说姜还是老的辣,轻量好用。之前一直在Linux下作各种工作,所以Vsftpd这位老兄就成为不二之选。

1. Vsftpd安装配置

     巧妇难为无米之炊。工欲善其事,必先利其器。所以要想FTP玩得好的,你得有一个才行。那么是不是我们直接安装一个Vsftpd就可以了呢?当然没有那么简单。还有比较重要的一步就是需要设置访问权限。而Vsftpd的文件目录访问权限也是客户端访问权限。安全第一。

1.1. Vsftpd安装

    这里我们还是选择Ubuntu为环境作介绍,其他的发行版的Linux请各位自行研究。在Ubuntu

下面安装比较简单。在终端命令行中运行如下命令即可:

apt-get install -y vsftpd

1.2. Vsftpd配置

    安装完Vsftpd后,通常只需要在配置文件指定local_root=/path/to/directory即可。但是我们想要只有特定的用户可以访问,那么就要费一番功夫了。其中的一种方法首先是需要创建特定的用户以及用户目录。

useradd -d "/home/{user}" -s /usr/sbin/nologin "{user}"echo "{user}:{password}" | chpasswdadduser {user} ftp

chgrp -R ftp "/home/{user}"chown -R {user} "/home/{user}"chmod -R 744 "/home/{user}"

     上面我们创建了{user}的用户,同时在home目录下创建了同名的用户目录并赋予相应的权限。创建成功后,我们需要做的是将指定的目录以及权限配置到Vsftpd。这里需要用到Vsftpd的chroot_list_file配置项。

    开始配置之前我们首先需要创建一个vsftpd.chroot_list文件。文件的内容就是上面的用户名:{user}。

   然后我们需要找到/etc目录下的vsftpd.conf配置文件。将配置文件中的chroot_list_file配置项指向刚才创建的文件。然后开启读写权限即可。

write_enable=YES

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/path/to/vsftpd.chroot_list

   最后重启一下Vsftpd让配置生效即可。

2. Java调用FTP服务

    安装好Vsftpd后,那么Java怎么和FTP服务端服务交互,进行读写呢?这里我们需要使用Apache的commons-net架包。

2.1. 初始化客户端

   在项目中引入commons-net架包后,首先我们需要初始化获得FTPClient实例。

FTPClient ftpClient = new FTPClient();// 连接FPT服务器,设置IP及端口ftpClient.connect(host, port);// 设置用户名和密码ftpClient.login(username, password);// 设置连接超时时间,5000毫秒ftpClient.setConnectTimeout(50000);// 设置中文编码集,防止中文乱码ftpClient.setControlEncoding("UTF-8");

//检查一下是否正常链接FTPReply.isPositiveCompletion(ftpClient.getReplyCode())

    创建链接时,不光需要指定通讯地址和端口,同时需要指定用户名和密码。这里的用户名就是配置在vsftpd.chroot_list的用户名,密码就是其对应的密码。

2.2. 写入文件

    创建链接后,我们可以开始往FTP服务器写入文件。写入文件之前,首先我们需要指定文件存储目录。然后对应写入文件。

ftpClient.changeWorkingDirectory(ROOT_FOLDER);ftpClient.enterLocalPassiveMode();ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.storeFile(fileName, input);

2.3. 创建文件夹

    处理写入文件,你也可以想操作正常文件系统一样创建文件夹:

ftpClient.makeDirectory(folder);

2.4. 读取文件

    读取文件需要使用retrieveFile方法,和正常读取文件一下,指定文件路径,然后将内容输出到输出流中即可。

ftpClient.retrieveFile(filePath, outputStream);

    如何使用Java进行FTP服务调用的操作基本就是这些。当然最后可能还需要注意一下将链接关闭,调用一下FTPClient的logout方法即可。