FTP操作

package com.opslab.util.ftp;

import java.util.Date;

/**
* FTP文件熟悉
*/
public class FileAttr {
private String fileName;
private Date ModifyTime;
private Long size;

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public Date getModifyTime() {
return new Date(ModifyTime.getTime());
}

public void setModifyTime(Date modifyTime) {
ModifyTime = modifyTime;
}

public Long getSize() {
return size;
}

public void setSize(Long size) {
this.size = size;
}
}

 

 

 

 

 

 

 

 

package com.opslab.util.ftp;

import java.util.HashMap;
import java.util.Map;

/**
* FTP相关的一些配置
*/
public class FTPConstant {
/**
* FTP状态码及其描述
*/
public static Map<Integer,String> REPLYCODE = new HashMap<Integer,String>();
//用于编码转换
private static String ISO_ECODING = "ISO-8859-1";
//程序运行的编码
private static String PROJECT_ENCODING = "UTF-8";

static {
REPLYCODE.put(120, "服务已就绪,在 nnn 分钟后开始。");
REPLYCODE.put(125, "数据连接已打开,正在开始传输。");
REPLYCODE.put(150, "文件状态正常,准备打开数据连接。");
REPLYCODE.put(202, "未执行命令,站点上的命令过多。");
REPLYCODE.put(211, "系统状态,或系统帮助答复。");
REPLYCODE.put(212, "目录状态。");
REPLYCODE.put(213, "文件状态。");
REPLYCODE.put(214, "帮助消息。");
REPLYCODE.put(215, "NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。");
REPLYCODE.put(220, "服务就绪,可以执行新用户的请求。");
REPLYCODE.put(221, "服务关闭控制连接。如果适当,请注销。");
REPLYCODE.put(225, "数据连接打开,没有进行中的传输。");
REPLYCODE.put(226, "关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。");
REPLYCODE.put(227, "进入被动模式 (h1,h2,h3,h4,p1,p2)。");
REPLYCODE.put(230, "用户已登录,继续进行。");
REPLYCODE.put(250, "请求的文件操作正确,已完成。");
REPLYCODE.put(257, "已创建“PATHNAME”。");
REPLYCODE.put(332, "需要登录帐户。");
REPLYCODE.put(350, "请求的文件操作正在等待进一步的信息。");
REPLYCODE.put(425, "无法打开数据连接。");
REPLYCODE.put(426, "Connection closed; transfer aborted.");
REPLYCODE.put(450, "未执行请求的文件操作。文件不可用(例如,文件繁忙)。");
REPLYCODE.put(451, "请求的操作异常终止:正在处理本地错误。");
REPLYCODE.put(452, "未执行请求的操作。系统存储空间不够。");
REPLYCODE.put(501, "在参数中有语法错误。");
REPLYCODE.put(502, "未执行命令。");
REPLYCODE.put(503, "错误的命令序列。");
REPLYCODE.put(504, "未执行该参数的命令。");
REPLYCODE.put(530, "未登录。");
REPLYCODE.put(532, "存储文件需要帐户。");
REPLYCODE.put(550, "未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。");
REPLYCODE.put(551, "请求的操作异常终止:未知的页面类型。");
REPLYCODE.put(552, "请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。");
REPLYCODE.put(553, "未执行请求的操作。不允许的文件名。");
}

}

 

 

 

 

 

package com.opslab.util.ftp;

import com.opslab.util.OpslabConfig;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
* FTP工具类
*/
public class FTPFactory {


//获取一个实例
public static FTPUtil getInstance(String Name) throws IOException {

String host = OpslabConfig.get(Name + ".host");
if (host != null) {
int port = Integer.parseInt(OpslabConfig.get(Name + ".port"));
String username = OpslabConfig.get(Name + ".username");
String password = OpslabConfig.get(Name + ".password");
String remoteDir = OpslabConfig.get(Name + ".remoteDir");
String localDir = OpslabConfig.get(Name + ".localDir");
String Encoding = OpslabConfig.get(Name + ".Encoding");
boolean passiveMode = new Boolean(OpslabConfig.get(Name + ".passiveMode")).booleanValue();
FTPVo vo = new FTPVo(host, port, username, password, remoteDir, localDir, Encoding, passiveMode);
return new FTPUtilImpl(vo);
} else {
throw new IOException("config error");
}
}
}

 

 

 

 

 

package com.opslab.util.ftp;

import com.opslab.util.DateUtil;

/**
* Created by Administrator on 2015-04-08.
*/
public class FTPLog {
private String host;
private String operation;
private int ReplyCode;
private String localFile;
private String remoteFile;
private String ReplyCodeDesc;
private String createTime = DateUtil.currentDateTime();

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}

public int getReplyCode() {
return ReplyCode;
}

public void setReplyCode(int replyCode) {
ReplyCode = replyCode;
}

public String getLocalFile() {
return localFile;
}

public void setLocalFile(String localFile) {
this.localFile = localFile;
}

public String getRemoteFile() {
return remoteFile;
}

public void setRemoteFile(String remoteFile) {
this.remoteFile = remoteFile;
}

public String getReplyCodeDesc() {
return ReplyCodeDesc;
}

public void setReplyCodeDesc(String replyCodeDesc) {
ReplyCodeDesc = replyCodeDesc;
}

public String getCreateTime() {
return createTime;
}

public void setCreateTime(String createTime) {
this.createTime = createTime;
}

public String getOperation() {
return operation;
}

public void setOperation(String operation) {
this.operation = operation;
}

@Override
public String toString() {
return "FTPLog{" +
"host='" + host + '\'' +
", operation='" + operation + '\'' +
", ReplyCode=" + ReplyCode +
", localFile='" + localFile + '\'' +
", remoteFile='" + remoteFile + '\'' +
", ReplyCodeDesc='" + ReplyCodeDesc + '\'' +
", createTime='" + createTime + '\'' +
'}';
}
}

 

 

 

 

package com.opslab.util.ftp;


import org.apache.commons.net.ftp.FTPClient;

import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
* FTP工具类
*
* @require apache-commons-net.jar.
*/
public interface FTPUtil {
//判断远程文件是否存在
public boolean isExists(String fileName);

//下载远程文件
public boolean downLoad(String fileName);

//下载远程目录
public boolean downLoadDir(String directory);

//删除远程文件
public boolean deleteFile(String fileName);

//删除远程目录
public boolean deleteDir(String directory);

//上传本地文件到远程目录
public boolean putFile(String fileName, String remoteFileName, boolean isDelete);

//上传本地文件到远程目录
public boolean putFile(File file, String remoteFileName, boolean isDelete);

//上传本地目录到远程
public boolean putDir(String fileName, String remoteDir);

//上传本地目录到远程
public boolean putDir(File file, String remoteDir);

//创建文件夹
public boolean mkDir(String destory);


//获取远程文件列表
public List<String> listFile(String directory);

//获取远程文件夹的目录结构
public LinkedList<String> listDir(String direcotyr);

//获取远程文件属性以Map形式返回
public Map<String,FileAttr> listFileAttr(String directory);

//改变FTP连接的工作目录
public boolean changeWorkDir(String directory);

//获取当前连接的工作目录
public String getWorkDir();

//重命名文件
public boolean changName(String oldName, String newName);

//返回FTPCliend对象(已经打开连接)
public FTPClient client();

//释放所有的资源
public void destory();
}

 

 

package com.opslab.util.ftp;

import com.opslab.util.FileUtil;
import com.opslab.util.CheckUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* FTP工具类的实现
*/
public class FTPUtilImpl implements FTPUtil {
private Logger logger = Logger.getLogger(FTPUtilImpl.class);
private FTPClient client;
private FTPVo vo;


public FTPUtilImpl(FTPVo vo) throws IOException {
this.vo = vo;
client = createFTPClien(vo);
}

//创建变连接FTP
private FTPClient createFTPClien(FTPVo vo) {
FTPClient client = new FTPClient();
int reply = -1;
try {
client.connect(vo.getHostName(), vo.getPort());
client.login(vo.getUsername(), vo.getPassword());
reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
return null;
} else {
client.setControlEncoding(vo.getRemoteEncoding());
client.setFileType(FTPClient.BINARY_FILE_TYPE);
if (vo.isPassiveMode()) {
client.enterLocalPassiveMode();
} else {
client.enterRemotePassiveMode();
}
client.cwd(vo.getRemoteDir());
}
return client;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}


//通过FTP响应码判断是否操作成功
public boolean reply(String operation) {
int replyCode = client.getReplyCode();
FTPLog log = new FTPLog();
log.setHost(vo.getHostName());
log.setOperation(operation);
log.setLocalFile("");
log.setRemoteFile("");
log.setReplyCode(replyCode);
log.setReplyCodeDesc(FTPConstant.REPLYCODE.get(replyCode));
logger.info(log);
return FTPReply.isPositiveCompletion(replyCode);
}

public boolean reply(String operation, String localFile, String remoteFile) {
int replyCode = client.getReplyCode();
FTPLog log = new FTPLog();
log.setHost(vo.getHostName());
log.setOperation(operation);
log.setLocalFile(localFile);
log.setRemoteFile(remoteFile);
log.setReplyCode(replyCode);
log.setReplyCodeDesc(FTPConstant.REPLYCODE.get(replyCode));
logger.info(log);
return FTPReply.isPositiveCompletion(replyCode);
}

@Override
public boolean isExists(String fileName) {
List<String> list = listFile(vo.getRemoteDir());
if (list.contains(fileName)) {
return true;
}
return false;
}

@Override
public boolean downLoad(String fileName) {
String localfileName = vo.getLocalDir() + File.separator + fileName;
FileUtil.createFiles(localfileName);
OutputStream out = null;
try {
out = new FileOutputStream(localfileName, true);
client.retrieveFile(new String(fileName.getBytes(vo.getRemoteEncoding()), "ISO-8859-1"), out);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return reply("DOWNLOAD", localfileName, fileName);
}

@Override
public boolean downLoadDir(String directory) {
List<String> files = listFile(directory);
for (String s : files) {
downLoad(s);
}
return true;
}

@Override
public boolean deleteFile(String fileName) {
if (isExists(fileName)) {
try {
client.deleteFile(new String(fileName.getBytes(vo.getRemoteEncoding()), "ISO-8859-1"));
return reply("DELETE", "", fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}

@Override
public boolean deleteDir(String directory) {
List<String> files = listFile(directory);
try {
for (String s : files) {
deleteFile(s);
}
List<String> dirs = listDir(directory);
for (int i = dirs.size() - 1; i >= 0; i--) {
client.removeDirectory(new String(dirs.get(i).getBytes(vo.getRemoteEncoding()), "ISO-8859-1"));
}
client.removeDirectory(new String(directory.getBytes(vo.getRemoteEncoding()), "ISO-8859-1"));
} catch (IOException e) {
e.printStackTrace();
}
return reply("DELETE", "", directory);
}

@Override
public boolean putFile(String fileName, String remoteFileName, boolean isDelete) {
File file = new File(fileName);
return putFile(file, remoteFileName, isDelete);
}

@Override
public boolean putFile(File file, String remoteFileName, boolean isDelete) {
String fileName = remoteFileName;
String path = "";
String parent = getParentPath(remoteFileName);
if (remoteFileName.lastIndexOf("/") != -1) {
path = remoteFileName.substring(0, remoteFileName.lastIndexOf("/"));
fileName = remoteFileName.substring(remoteFileName.lastIndexOf("/") + 1);
mkDir(path);
changeWorkDir(path);
}
try (InputStream in = new FileInputStream(file)) {
if (isDelete) {
deleteFile(new String(file.getName().getBytes(vo.getRemoteEncoding()), "ISO-8859-1"));
}
client.appendFile(new String(fileName.getBytes(vo.getRemoteEncoding()), "ISO-8859-1"), in);
return reply("UPLOAD", file.getAbsoluteFile().toString(), remoteFileName);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

@Override
public boolean putDir(String fileName, String remoteDir) {
File file = new File(fileName);
return putDir(file, remoteDir);
}

@Override
public boolean putDir(File file, String remoteDir) {
List<File> list = FileUtil.listFile(file);
for (File f : list) {
String name = f.getAbsolutePath();
name = name.substring(name.indexOf(file.getName())).replaceAll("\\\\", "/");
putFile(f, remoteDir + "/" + name, true);
}
return true;
}

@Override
public List<String> listFile(String directory) {
List<String> list = new ArrayList<String>();
try {
FTPFile[] files = client.listFiles(directory);
for (int i = 0; i < files.length; i++) {
String t = (directory + "/" + files[i].getName()).replaceAll("//", "/");
if (files[i].isFile()) {
list.add(t);
} else if (files[i].isDirectory()) {
list.addAll(listFile((t + "/").replaceAll("//", "/")));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

@Override
public Map<String,FileAttr> listFileAttr(String directory) {
Map<String,FileAttr> map = new HashMap<String,FileAttr>();
try {
FTPFile[] files = client.listFiles(directory);
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
FTPFile file = files[i];
String fileName = directory + file.getName();
FileAttr attr = new FileAttr();
attr.setFileName(fileName);
attr.setModifyTime(file.getTimestamp().getTime());
attr.setSize(file.getSize());
map.put(fileName, attr);
} else if (files[i].isDirectory()) {
map.putAll(listFileAttr(directory + files[i].getName() + "/"));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return map;
}

@Override
public boolean changeWorkDir(String directory) {
try {
client.cwd(directory);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

@Override
public String getWorkDir() {
try {
return client.printWorkingDirectory();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}

@Override
public boolean mkDir(String directory) {
directory = directory.replaceAll("//", "/");
if (directory.startsWith("/")) {
directory = directory.substring(1);
}
if (directory.endsWith("/")) {
directory = directory.substring(0, directory.length() - 1);
}
try {
String[] str = (new String(directory.getBytes(vo.getRemoteEncoding()), "ISO-8859-1")).split("/");
String t = "";
String parnet = "";
for (int i = 0; i < str.length; i++) {
t += ("/" + str[i]);
if (!isExists(t.substring(1))) {
client.makeDirectory(str[i]);
}
client.changeWorkingDirectory(str[i]);
parnet += "../";
}
if (str.length >= 1) {
client.changeWorkingDirectory(parnet);
}

} catch (IOException e) {
e.printStackTrace();
}
return false;
}


@Override
public boolean changName(String oldName, String newName) {
return false;
}

public LinkedList<String> listDir(String directory) {
LinkedList<String> list = new LinkedList<String>();
try {
FTPFile[] files = client.listFiles(directory);
for (int i = 0; i < files.length; i++) {
String t = (directory + "/" + files[i].getName()).replaceAll("//", "/");
if (files[i].isDirectory()) {
list.add(t);
list.addAll(listDir(t + "/"));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}

@Override
public FTPClient client() {
return client;
}

@Override
public void destory() {
if (CheckUtil.valid(client)) {
try {
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}


private String getParentPath(String file) {
if (file.indexOf("/") != -1) {
String temp = null;
Pattern p = Pattern.compile("[/]+");
Matcher m = p.matcher(file);
int i = 0;
while (m.find()) {
temp = m.group(0);
i += temp.length();
}
String parent = "";
for (int j = 0; j < i; j++) {
parent += "../";
}
return parent;
} else {
return "./";
}
}

private String getRelativePath(File path) {
String path1 = path.getPath();
String path2 = path.getAbsolutePath();
return null;

}
}

 

 

package com.opslab.util.ftp;

/**
* 用于包装FTP的相关的信息
*/
public class FTPVo {
private String hostName;
private int port;
private String username;
private String password;
private String remoteDir;
private String localDir;
private String remoteEncoding;
private boolean passiveMode;


public FTPVo(String hostName, int port, String username, String password, String remoteDir, String localDir,
String remoteEncoding, boolean passiveMode) {
this.hostName = hostName;
this.port = port;
this.remoteDir = remoteDir;
this.localDir = localDir;
this.remoteEncoding = remoteEncoding;
this.passiveMode = passiveMode;
this.username = username;
this.password = password;
}

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 getHostName() {
return hostName;
}

public void setHostName(String hostName) {
this.hostName = hostName;
}

public String getRemoteDir() {
return remoteDir;
}

public void setRemoteDir(String remoteDir) {
this.remoteDir = remoteDir;
}

public String getLocalDir() {
return localDir;
}

public void setLocalDir(String localDir) {
this.localDir = localDir;
}

public String getRemoteEncoding() {
return remoteEncoding;
}

public void setRemoteEncoding(String remoteEncoding) {
this.remoteEncoding = remoteEncoding;
}


public boolean isPassiveMode() {
return passiveMode;
}

public void setPassiveMode(boolean passiveMode) {
this.passiveMode = passiveMode;
}
}

posted on 2019-01-11 13:42  我是司  阅读(557)  评论(0)    收藏  举报

导航