写在前面
FTP是一个文件传输协议,被开发人员广泛用于在互联网中文件传输的一套标准协议。
而我们通常在开发过程中也要通过FTP来搭建文件系统,用于存储系统文件等。
目前正值SpringBoot热潮,所以我们接下来会一起学习一下SpringBoot如何集成FTP,以及相关的FTP组件包,还有其主要提供的几个方法。
当然在这系列文章结尾,我们还会给出确切的FTP操作工具类,算是一些小成果,希望和大家共勉。
FTP相关软件安装
我在此就不介绍如何安装FTP了,但是我可以推荐给大家一些软件作为选择。
Linux版本,推荐使用vsftpd进行搭建FTP,只需要改指定的几个配置,添加上用户即可。
Windows版本,推荐使用Serv-U进行搭建FTP,图形化界面,有中文版,操作起来很简单。
开始集成
引入相关jar包
这里我们对FTP相关的组件包使用的是edtFTPj
,其实之前很多人都选择的是Java自带的包来实现FTP功能的。
在我们的SpringBoot项目中pom.xml下添加以下依赖。
<dependency><groupId>com.enterprisedt</groupId><artifactId>edtFTPj</artifactId><version>1.5.3</version></dependency>
更新maven进行引入,然后我们进行下一步。
引入FTPUtils.java和FTPHelper.java
引入两个工具类。
我这里先贡献一下代码,请大家酌情作为参考。
/***Ftp工具类*/publicclassFtpHelper{privateFTPClientftp;publicFtpHelper(){}/***初始化Ftp信息**@paramftpServerftp服务器地址*@paramftpPortFtp端口号*@paramftpUsernameftp用户名*@paramftpPasswordftp密码*/publicFtpHelper(StringftpServer,intftpPort,StringftpUsername,StringftpPassword){connect(ftpServer,ftpPort,ftpUsername,ftpPassword);}/***连接到ftp**@paramftpServerftp服务器地址*@paramftpPortFtp端口号*@paramftpUsernameftp用户名*@paramftpPasswordftp密码*/publicvoidconnect(StringftpServer,intftpPort,StringftpUsername,StringftpPassword){ftp=newFTPClient();try{ftp.setControlEncoding("UTF-8");ftp.setRemoteHost(ftpServer);ftp.setRemotePort(ftpPort);ftp.setTimeout(6000);ftp.setConnectMode(FTPConnectMode.ACTIVE);ftp.connect();ftp.login(ftpUsername,ftpPassword);ftp.setType(FTPTransferType.BINARY);}catch(Exceptione){e.printStackTrace();ftp=null;}}/***更改ftp路径**@paramftp*@paramdirName*@return*/publicbooleancheckDirectory(FTPClientftp,StringdirName){booleanflag;try{ftp.chdir(dirName);flag=true;}catch(Exceptione){e.printStackTrace();flag=false;}returnflag;}/***断开ftp链接*/publicvoiddisconnect(){try{if(ftp.connected()){ftp.quit();}}catch(Exceptione){e.printStackTrace();}}/***读取ftp文件流**@paramfilePathftp文件路径*@returns*@throwsException*/publicInputStreamdownloadFile(StringfilePath)throwsException{InputStreaminputStream=null;StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){ftp.chdir(s);}}byte[]data;try{data=ftp.get(fileName);inputStream=newByteArrayInputStream(data);}catch(Exceptione){e.printStackTrace();}returninputStream;}/***上传文件到ftp**@paramfile文件对象*@paramfilePath上传的路径*@throwsException*/publicvoiduploadFile(Filefile,StringfilePath)throwsException{InputStreaminStream=newFileInputStream(file);uploadFile(inStream,filePath);}/***上传文件到ftp**@paraminStream上传的文件流*@paramfilePath上传路径*@throwsException*/publicvoiduploadFile(InputStreaminStream,StringfilePath)throwsException{if(inStream==null){return;}StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){if(!checkDirectory(ftp,s)){ftp.mkdir(s);}}}ftp.put(inStream,fileName);}/***删除ftp文件**@paramfilePath文件路径*@throwsException*/publicvoiddeleteFile(StringfilePath)throwsException{StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){if(checkDirectory(ftp,s)){ftp.chdir(s);}}}ftp.delete(fileName);}/***切换目录**@parampath*@throwsException*/publicvoidchangeDirectory(Stringpath){if(!ValidateUtils.isEmpty(path)){try{ftp.chdir(path);}catch(Exceptione){e.printStackTrace();}}}}
/***Ftp工具类*/publicclassFtpHelper{privateFTPClientftp;publicFtpHelper(){}/***初始化Ftp信息**@paramftpServerftp服务器地址*@paramftpPortFtp端口号*@paramftpUsernameftp用户名*@paramftpPasswordftp密码*/publicFtpHelper(StringftpServer,intftpPort,StringftpUsername,StringftpPassword){connect(ftpServer,ftpPort,ftpUsername,ftpPassword);}/***连接到ftp**@paramftpServerftp服务器地址*@paramftpPortFtp端口号*@paramftpUsernameftp用户名*@paramftpPasswordftp密码*/publicvoidconnect(StringftpServer,intftpPort,StringftpUsername,StringftpPassword){ftp=newFTPClient();try{ftp.setControlEncoding("UTF-8");ftp.setRemoteHost(ftpServer);ftp.setRemotePort(ftpPort);ftp.setTimeout(6000);ftp.setConnectMode(FTPConnectMode.ACTIVE);ftp.connect();ftp.login(ftpUsername,ftpPassword);ftp.setType(FTPTransferType.BINARY);}catch(Exceptione){e.printStackTrace();ftp=null;}}/***更改ftp路径**@paramftp*@paramdirName*@return*/publicbooleancheckDirectory(FTPClientftp,StringdirName){booleanflag;try{ftp.chdir(dirName);flag=true;}catch(Exceptione){e.printStackTrace();flag=false;}returnflag;}/***断开ftp链接*/publicvoiddisconnect(){try{if(ftp.connected()){ftp.quit();}}catch(Exceptione){e.printStackTrace();}}/***读取ftp文件流**@paramfilePathftp文件路径*@returns*@throwsException*/publicInputStreamdownloadFile(StringfilePath)throwsException{InputStreaminputStream=null;StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){ftp.chdir(s);}}byte[]data;try{data=ftp.get(fileName);inputStream=newByteArrayInputStream(data);}catch(Exceptione){e.printStackTrace();}returninputStream;}/***上传文件到ftp**@paramfile文件对象*@paramfilePath上传的路径*@throwsException*/publicvoiduploadFile(Filefile,StringfilePath)throwsException{InputStreaminStream=newFileInputStream(file);uploadFile(inStream,filePath);}/***上传文件到ftp**@paraminStream上传的文件流*@paramfilePath上传路径*@throwsException*/publicvoiduploadFile(InputStreaminStream,StringfilePath)throwsException{if(inStream==null){return;}StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){if(!checkDirectory(ftp,s)){ftp.mkdir(s);}}}ftp.put(inStream,fileName);}/***删除ftp文件**@paramfilePath文件路径*@throwsException*/publicvoiddeleteFile(StringfilePath)throwsException{StringfileName="";filePath=StringUtils.removeStart(filePath,"/");intlen=filePath.lastIndexOf("/");if(len==-1){if(filePath.length()>0){fileName=filePath;}else{thrownewException("没有输入文件路径");}}else{fileName=filePath.substring(len+1);Stringtype=filePath.substring(0,len);String[]typeArray=type.split("/");for(Strings:typeArray){if(checkDirectory(ftp,s)){ftp.chdir(s);}}}ftp.delete(fileName);}/***切换目录**@parampath*@throwsException*/publicvoidchangeDirectory(Stringpath){if(!ValidateUtils.isEmpty(path)){try{ftp.chdir(path);}catch(Exceptione){e.printStackTrace();}}}}
如何使用
publicstaticvoidmain(String[]args){try{//从ftp下载文件FtpHelperftp=newFtpHelper("127.0.0.1",21,"root","123456");Filefile=newFile("D:\1.doc");ftp.uploadFile(file,"test/weradsfad2.doc");ftp.disconnect();}catch(Exceptione){e.printStackTrace();}}