Apache FTPClient操作文件上传下载及公共类
2015-11-23 15:41
976 查看
我们在项目中可能需要使用ftp进行文件的上传、下载、获取服务器目录信息等相关操作,我们可以使用apache的FTPClient进行相关的操作,下面把相关公共方法与大家交流分享,每个方法前都有详细的注释进行讲解,不过在进行ftp测试的时候,我们需要配置一个ftp的服务器,进行文件的上传和下载,大家可以在网上找相关资料进行设置,把环境搭建好就可以进行我们的测试了:
编写我们的FTPCongfig类,用于将登陆信息封装为我们实体类:
2、编写我们的FtpUtil进行ftp相关操作:
3、编写我们的测试类:
分享
收藏
纠错
<iframe id="cproIframe_u1665123_1" width="580" height="90" src="http://pos.baidu.com/acom?adn=3&at=166&aurl=&cad=0&ccd=24&cec=UTF-8&cfv=0&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&layout_filter=rank%2Ctabcloud<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DQeNDVYaD0jjUUeSuab8MzLVwcIxRzrvcMMSDc-3Kb43BsXnjhgpEOSSSHPv16Bdv%26wd%3D%26eqid%3Dbe0122a0000060ed000000065652a991<u=http%3A%2F%2Fwww.tuicool.com%2Farticles%2F7NVRRv&lunum=6&n=00092120_cpr&pcs=1903x955&pis=10000x10000&ps=7782x476&psr=1920x1080&pss=1903x7994&qn=751cafeb1ec421fd&rad=&rsi0=580&rsi1=90&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=%23ffffff&scale=&skin=&td_id=1665123&tn=text_default_580_90&tpr=1448257955194&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1665123&ti=Apache%20FTPClient%E6%93%8D%E4%BD%9C%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E5%8F%8A%E5%85%AC%E5%85%B1%E7%B1%BB%20-%20%E6%8E%A8%E9%85%B7&tt=1448257954693.502.713.721" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>
推荐文章
1. Presto DB 简介
2. 日志系统之Flume采集加morphline解析
3. 容器私有云和持续发布都要解决哪些基础问题 第二集
4. zookeeper源码分析之一客户端
5. 使用Spark进行微服务的实时性能分析
6. [期刊]Hadoop平台中一种Reduce负载均衡贪心算法
编写我们的FTPCongfig类,用于将登陆信息封装为我们实体类:
package com.xin.test; /** * ftp登陆配置信息 * @author HarderXin * */ public class FtpConfig { //服务器地址名称 private String server; //端口号 private int port; //用户名称 private String username; //密码 private String password; //工作目录 private String location; public String getServer() { return server; } public void setServer(String server) { this.server = server; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } }
2、编写我们的FtpUtil进行ftp相关操作:
package com.xin.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import java.util.ArrayList; import java.util.List; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPFileFilter; public class FtpUtil { private FTPClient ftpClient; public static final int BINARY_FILE_TYPE = FTP.BINARY_FILE_TYPE; public static final int ASCII_FILE_TYPE = FTP.ASCII_FILE_TYPE; /** * 利用FtpConfig进行服务器连接 * @param ftpConfig 参数配置Bean类 * @throws SocketException * @throws IOException */ public void connectServer(FtpConfig ftpConfig) throws SocketException, IOException { String server = ftpConfig.getServer(); int port = ftpConfig.getPort(); String user = ftpConfig.getUsername(); String password = ftpConfig.getPassword(); String location = ftpConfig.getLocation(); connectServer(server, port, user, password, location); } /** * 使用详细信息进行服务器连接 * @param server:服务器地址名称 * @param port:端口号 * @param user:用户名 * @param password:用户密码 * @param path:转移到FTP服务器目录 * @throws SocketException * @throws IOException */ public void connectServer(String server, int port, String user, String password, String path) throws SocketException, IOException { ftpClient = new FTPClient(); ftpClient.connect(server, port); System.out.println("Connected to " + server + "."); //连接成功后的回应码 System.out.println(ftpClient.getReplyCode()); ftpClient.login(user, password); if (path!=null&&path.length() != 0) { ftpClient.changeWorkingDirectory(path); } ftpClient.setBufferSize(1024);//设置上传缓存大小 ftpClient.setControlEncoding("UTF-8");//设置编码 ftpClient.setFileType(BINARY_FILE_TYPE);//设置文件类型 } /** * 设置传输文件类型:FTP.BINARY_FILE_TYPE | FTP.ASCII_FILE_TYPE * 二进制文件或文本文件 * @param fileType * @throws IOException */ public void setFileType(int fileType) throws IOException { ftpClient.setFileType(fileType); } /** * 关闭连接 * @throws IOException */ public void closeServer() throws IOException { if (ftpClient!=null&&ftpClient.isConnected()) { ftpClient.logout();//退出FTP服务器 ftpClient.disconnect();//关闭FTP连接 } } /** * 转移到FTP服务器工作目录 * @param path * @return * @throws IOException */ public boolean changeDirectory(String path) throws IOException { return ftpClient.changeWorkingDirectory(path); } /** * 在服务器上创建目录 * @param pathName * @return * @throws IOException */ public boolean createDirectory(String pathName) throws IOException { return ftpClient.makeDirectory(pathName); } /** * 在服务器上删除目录 * @param path * @return * @throws IOException */ public boolean removeDirectory(String path) throws IOException { return ftpClient.removeDirectory(path); } /** * 删除所有文件和目录 * @param path * @param isAll true:删除所有文件和目录 * @return * @throws IOException */ public boolean removeDirectory(String path, boolean isAll) throws IOException { if (!isAll) { return removeDirectory(path); } FTPFile[] ftpFileArr = ftpClient.listFiles(path); if (ftpFileArr == null || ftpFileArr.length == 0) { return removeDirectory(path); } // for (FTPFile ftpFile : ftpFileArr) { String name = ftpFile.getName(); if (ftpFile.isDirectory()) { System.out.println("* [sD]Delete subPath ["+path + "/" + name+"]"); removeDirectory(path + "/" + name, true); } else if (ftpFile.isFile()) { System.out.println("* [sF]Delete file ["+path + "/" + name+"]"); deleteFile(path + "/" + name); } else if (ftpFile.isSymbolicLink()) { } else if (ftpFile.isUnknown()) { } } return ftpClient.removeDirectory(path); } /** * 检查目录在服务器上是否存在 true:存在 false:不存在 * @param path * @return * @throws IOException */ public boolean existDirectory(String path) throws IOException { boolean flag = false; FTPFile[] ftpFileArr = ftpClient.listFiles(path); for (FTPFile ftpFile : ftpFileArr) { if (ftpFile.isDirectory() && ftpFile.getName().equalsIgnoreCase(path)) { flag = true; break; } } return flag; } public boolean isExistsFile(String fileName) { try { FTPFile[] file = ftpClient.listFiles(fileName); return file.length > 0 ? true : false; } catch (IOException e) { e.printStackTrace(); return false; } } /** * 得到文件列表,listFiles返回包含目录和文件,它返回的是一个FTPFile数组 * listNames():只包含目录的字符串数组 * String[] fileNameArr = ftpClient.listNames(path); * @param path:服务器上的文件目录:/DF4 */ public List<String> getFileList(String path) throws IOException { FTPFile[] ftpFiles= ftpClient.listFiles(path); //通过FTPFileFilter遍历只获得文件 /* FTPFile[] ftpFiles2= ftpClient.listFiles(path,new FTPFileFilter() { @Override public boolean accept(FTPFile ftpFile) { return ftpFile.isFile(); } }); */ List<String> retList = new ArrayList<String>(); if (ftpFiles == null || ftpFiles.length == 0) { return retList; } for (FTPFile ftpFile : ftpFiles) { if (ftpFile.isFile()) { retList.add(ftpFile.getName()); } } return retList; } /** * 删除服务器上的文件 * @param pathName * @return * @throws IOException */ public boolean deleteFile(String pathName) throws IOException { return ftpClient.deleteFile(pathName); } /** * 上传文件到ftp服务器 * 在进行上传和下载文件的时候,设置文件的类型最好是: * ftpUtil.setFileType(FtpUtil.BINARY_FILE_TYPE) * localFilePath:本地文件路径和名称 * remoteFileName:服务器文件名称 */ public boolean uploadFile(String localFilePath, String remoteFileName) throws IOException { boolean flag = false; InputStream iStream = null; try { iStream = new FileInputStream(localFilePath); //我们可以使用BufferedInputStream进行封装 //BufferedInputStream bis=new BufferedInputStream(iStream); //flag = ftpClient.storeFile(remoteFileName, bis); flag = ftpClient.storeFile(remoteFileName, iStream); } catch (IOException e) { flag = false; return flag; } finally { if (iStream != null) { iStream.close(); } } return flag; } /** * 上传文件到ftp服务器,上传新的文件名称和原名称一样 * @param fileName:文件名称 * @return * @throws IOException */ public boolean uploadFile(String fileName) throws IOException { return uploadFile(fileName, fileName); } /** * 上传文件到ftp服务器 * @param iStream 输入流 * @param newName 新文件名称 * @return * @throws IOException */ public boolean uploadFile(InputStream iStream, String newName) throws IOException { boolean flag = false; try { flag = ftpClient.storeFile(newName, iStream); } catch (IOException e) { flag = false; return flag; } finally { if (iStream != null) { iStream.close(); } } return flag; } /** * 从ftp服务器上下载文件到本地 * @param remoteFileName:ftp服务器上文件名称 * @param localFileName:本地文件名称 * @return * @throws IOException */ public boolean download(String remoteFileName, String localFileName) throws IOException { boolean flag = false; File outfile = new File(localFileName); OutputStream oStream = null; try { oStream = new FileOutputStream(outfile); //我们可以使用BufferedOutputStream进行封装 //BufferedOutputStream bos=new BufferedOutputStream(oStream); //flag = ftpClient.retrieveFile(remoteFileName, bos); flag = ftpClient.retrieveFile(remoteFileName, oStream); } catch (IOException e) { flag = false; return flag; } finally { oStream.close(); } return flag; } /** * 从ftp服务器上下载文件到本地 * @param sourceFileName:服务器资源文件名称 * @return InputStream 输入流 * @throws IOException */ public InputStream downFile(String sourceFileName) throws IOException { return ftpClient.retrieveFileStream(sourceFileName); } }
3、编写我们的测试类:
public static void main(String args[]) throws Exception{ //testUpload(); //testDownload(); FtpUtil ftpUtil=new FtpUtil(); ftpUtil.connectServer("192.168.1.254", FTPClient.DEFAULT_PORT, "image", "123456", null); //获得ftp服务器上目录名称为DF4下的所有文件名称 List<String> list=ftpUtil.getFileList("/DF4"); System.out.println("文件名称列表为:"+list); //上传本地D盘文件aaa.txt到服务器,服务器上名称为bbb.txt ftpUtil.uploadFile("d:" + File.separator + "aaa.txt", "eee.txt"); //从服务器上下载文件bbb.txt到本地d盘名称为ccc.txt ftpUtil.download("eee.txt", "d:" + File.separator + "fff.txt"); //删除ftp服务器上文件:bbb.txt //ftpUtil.deleteFile("bbb.txt"); }
分享
收藏
纠错
<iframe id="cproIframe_u1665123_1" width="580" height="90" src="http://pos.baidu.com/acom?adn=3&at=166&aurl=&cad=0&ccd=24&cec=UTF-8&cfv=0&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&layout_filter=rank%2Ctabcloud<r=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DQeNDVYaD0jjUUeSuab8MzLVwcIxRzrvcMMSDc-3Kb43BsXnjhgpEOSSSHPv16Bdv%26wd%3D%26eqid%3Dbe0122a0000060ed000000065652a991<u=http%3A%2F%2Fwww.tuicool.com%2Farticles%2F7NVRRv&lunum=6&n=00092120_cpr&pcs=1903x955&pis=10000x10000&ps=7782x476&psr=1920x1080&pss=1903x7994&qn=751cafeb1ec421fd&rad=&rsi0=580&rsi1=90&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=%23ffffff&scale=&skin=&td_id=1665123&tn=text_default_580_90&tpr=1448257955194&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1665123&ti=Apache%20FTPClient%E6%93%8D%E4%BD%9C%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E5%8F%8A%E5%85%AC%E5%85%B1%E7%B1%BB%20-%20%E6%8E%A8%E9%85%B7&tt=1448257954693.502.713.721" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>
推荐文章
1. Presto DB 简介
2. 日志系统之Flume采集加morphline解析
3. 容器私有云和持续发布都要解决哪些基础问题 第二集
4. zookeeper源码分析之一客户端
5. 使用Spark进行微服务的实时性能分析
6. [期刊]Hadoop平台中一种Reduce负载均衡贪心算法
相关文章推荐
- php+apache配置
- centos下配置apache用户及用户组权限
- 在Mac下配置php开发环境:Apache+php+MySql
- 去掉警告 org.apache.catalina.core.StandardContext setPath
- Apache下rewrite配置
- 如何卸载CentOS自带的apache
- Apache Shiro 关于Shiro 授权
- Apache Maven 入门篇(下)
- Apache Maven 入门篇 ( 上 )
- 聊聊 Apache 开源协议
- Apache配置之设置防盗链
- windows-x64 php5.6+apache2.4+mysql配置
- CentOS 6.5 安装Apache服务器后无法访问解决方法
- eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案
- 更改Apache默认网站根目录
- 架构设计:系统间通信(14)——RPC实例Apache Thrift 下篇(2)
- LAMP apache配置
- centos6.5安装apache2.x并修改默认80端口
- apache+php+mysql常见集成环境安装包
- 采用Apache Camel的开源系统集成方案与Fuse IDE的使用