因为业务需求,须要实现 ftp server 的文件上传和下载功能。因而便借助了 apache 的一个工具包 commons-net。使用起来很简单,可是有些细节比较坑,特此说明一下。linux
第三方包的核心工具类是 FTPClient ,无论是文件上传仍是文件下载,都要进行链接和登陆,具体会在代码中体现出来。apache
引入 maven 依赖服务器
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency>
ftp 服务器的链接信息maven
若是须要本身搭建和配置文件服务器,请自行百度工具
经常使用命令 rm -rf 目录名称 mkdir 目录名称 建立目录 touch 文件名 新建文件 cd 目录名称 切换目录 kill -9 进程ID 杀死进程 chmod 配置权限
文件上传其实就是把咱们本地的文件,放到文件服务器指定的目录下。 想象一下,若是咱们此时在一台 linux 服务器上新建一个文件夹和文件,该如何操做?优化
其实 FTPClient 实现文件上传的代码也是这个意思,其中用到的方法主要是:编码
分别对应上面的三个步骤。code
如下是完整代码,可是有几个细节须要说明:server
确保登陆用户拥有足够的权限,好比读写文件。进程
makeDirectory 方法没法建立多级目录,只能一层一层建立。
建立文件失败多是用户没有权限,也多是目录已存在。
中文乱码问题看代码
public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); try { // 1. 链接登陆 ftpClient.connect("主机名", 端口); boolean loginSuccessful = ftpClient.login("用户名", "密码!"); System.out.println(loginSuccessful ? "登陆成功" : "登陆失败"); String remotePath = "中文目录";// 上传的文件所在目录 String remotePathAfterTransferCode = new String(remotePath.getBytes("utf-8"), "iso-8859-1");// 防止中文乱码 String localFile = "/Users/zzz/Desktop/ftp-server/perfect.txt";// 本地待上传的文件 String remoteFilename = "remoteFile.txt";// 上传后 ftp server 的文件名称 // 2. 在 ftp server 上建立文件夹 boolean makeDirSuccessful = ftpClient.makeDirectory(remotePathAfterTransferCode); System.out.println("建立文件夹是否成功? " + makeDirSuccessful); // 3. 切换目录 boolean changeWorkingDirectorySuccessful = ftpClient.changeWorkingDirectory(remotePathAfterTransferCode); System.out.println(changeWorkingDirectorySuccessful ? "切换目录成功" : "切换目录失败"); // 4. 上传本地文件到 ftp server boolean uploadSuccessful = ftpClient.storeFile(remoteFilename, new FileInputStream(new File(localFile))); System.out.println(uploadSuccessful ? "上传成功" : "上传失败"); // 5. 退出登陆 ftpClient.logout(); } catch (Exception e) { e.printStackTrace(); } }
文件下载也是须要用户先链接登陆,而后才能下载。
核心方法就是 retrieveFile("服务器文件地址", 输出流);
具体代码以下:
public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); // 指定本地下载目录 String localPath = "/Users/zzz/Desktop/ftp-server"; try { ftpClient.connect("主机名", 21); boolean loginSuccess = ftpClient.login("用户名", "密码!"); System.out.println(loginSuccess ? "登陆成功" : "登陆失败"); // 文件下载 File localFile = new File(localPath + File.separatorChar + "ttt.txt"); OutputStream os = new FileOutputStream(localFile); boolean downloadSuccessful = ftpClient.retrieveFile("test.txt", os); os.close(); System.out.println(downloadSuccessful ? "下载成功!" : "下载失败!"); ftpClient.logout(); } catch (Exception e) { e.printStackTrace(); } }
FTPClient 实现文件上传和下载的方法很简单易懂,只是有些细节须要注意(常见的前面已经提到),固然上述的代码只是 demo 版, 具体的需求还要去优化,好比异常处理,如何建立多级文件夹之类的,最后就是须要定制配置 FTPClient ,好比编码之类的, 具体 API 自行查阅资料。