您的位置:首页 > 运维架构 > Apache

Apache FTPClient操作文件上传下载及公共类

2015-11-23 15:41 976 查看
我们在项目中可能需要使用ftp进行文件的上传、下载、获取服务器目录信息等相关操作,我们可以使用apache的FTPClient进行相关的操作,下面把相关公共方法与大家交流分享,每个方法前都有详细的注释进行讲解,不过在进行ftp测试的时候,我们需要配置一个ftp的服务器,进行文件的上传和下载,大家可以在网上找相关资料进行设置,把环境搭建好就可以进行我们的测试了:

编写我们的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&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DQeNDVYaD0jjUUeSuab8MzLVwcIxRzrvcMMSDc-3Kb43BsXnjhgpEOSSSHPv16Bdv%26wd%3D%26eqid%3Dbe0122a0000060ed000000065652a991&ltu=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负载均衡贪心算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: