|
@ -0,0 +1,460 @@
|
|
|
package com.yihu.ehr.framework.util.file;
|
|
|
|
|
|
import com.yihu.ehr.framework.util.log.LogService;
|
|
|
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.FTPReply;
|
|
|
|
|
|
import java.io.*;
|
|
|
import java.net.SocketException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* ftp 操作工具类
|
|
|
* Created by HZY on 2015/8/12.
|
|
|
*/
|
|
|
public class FtpFileUtil {
|
|
|
|
|
|
private int port = 21; // 端口号
|
|
|
private String username; //ftp 登录名
|
|
|
private String password; //ftp 登录密码
|
|
|
private String ftpHostName; //ftp 主机名(IP)
|
|
|
private FTPClient ftpClient = new FTPClient();
|
|
|
private FileOutputStream fos = null;
|
|
|
|
|
|
public FtpFileUtil(String username, String password, String ftpHostName, int port) {
|
|
|
this.username = username;
|
|
|
this.password = password;
|
|
|
this.ftpHostName = ftpHostName;
|
|
|
this.port = port;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 建立ftp连接
|
|
|
*/
|
|
|
public void connect() {
|
|
|
try {
|
|
|
// 连接
|
|
|
ftpClient.connect(ftpHostName, port);
|
|
|
int reply = ftpClient.getReplyCode();
|
|
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
|
|
ftpClient.disconnect();
|
|
|
}
|
|
|
// 登录
|
|
|
ftpClient.login(username, password);
|
|
|
ftpClient.setBufferSize(1024 * 1024 * 1);
|
|
|
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
|
|
|
// ftpClient.setControlEncoding("GBK");
|
|
|
ftpClient.setDefaultTimeout(60 * 1000);
|
|
|
ftpClient.setConnectTimeout(60 * 1000);
|
|
|
ftpClient.setDataTimeout(60 * 1000);
|
|
|
ftpClient.setRemoteVerificationEnabled(false);
|
|
|
} catch (SocketException e) {
|
|
|
LogService.getLogger().error("连接Ftp服务器异常:", e);
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("连接Ftp服务器异常:", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 关闭输入输出流
|
|
|
*/
|
|
|
public void closeConnect() {
|
|
|
try {
|
|
|
if (fos != null) {
|
|
|
fos.close();
|
|
|
}
|
|
|
ftpClient.logout();
|
|
|
ftpClient.disconnect();
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("关闭Ftp连接失败:", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 下载文件
|
|
|
*
|
|
|
* @param ftpFileName ftp文件路径
|
|
|
* @param localDir 本地保存路径
|
|
|
*/
|
|
|
public boolean down(String ftpFileName, String localDir) {
|
|
|
connect();
|
|
|
boolean flag = downFile(ftpFileName, localDir);
|
|
|
closeConnect();
|
|
|
return flag;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 上传文件
|
|
|
*
|
|
|
* @param localDir 本地文件
|
|
|
* @param ftpFileName ftp上传路径
|
|
|
* @return 是否上传成功
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public boolean upload(String localDir, String ftpFileName) throws Exception {
|
|
|
connect();
|
|
|
boolean flag = uploadFile(localDir, ftpFileName);
|
|
|
closeConnect();
|
|
|
return flag;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 下载单个ftp上文件
|
|
|
*
|
|
|
* @param ftpFileName ftp文件路径
|
|
|
* @param localDir 本地保存路径
|
|
|
* @return 是否下载成功
|
|
|
*/
|
|
|
public boolean downFile(String ftpFileName, String localDir) {
|
|
|
boolean success = false;
|
|
|
try {
|
|
|
File file = new File(ftpFileName);
|
|
|
File temp = new File(localDir);
|
|
|
if (!temp.exists()) {
|
|
|
temp.mkdirs();
|
|
|
}
|
|
|
File localfile = new File(localDir + File.separator + file.getName());
|
|
|
if (!localfile.exists()) {
|
|
|
fos = new FileOutputStream(localfile);
|
|
|
success = ftpClient.retrieveFile(ftpFileName, fos);
|
|
|
}
|
|
|
ftpClient.changeToParentDirectory();
|
|
|
} catch (SocketException e) {
|
|
|
LogService.getLogger().error("Ftp服务器连接失败!", e);
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp文件下载失败!", e);
|
|
|
}
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 写入文件至ftp
|
|
|
*
|
|
|
* @param local 写入到FTP服务器上的文件
|
|
|
* @param remote FTP服务器保存目录
|
|
|
* @return 是否上传成功
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public boolean uploadFile(String local, String remote) {
|
|
|
boolean success = false;
|
|
|
File localFile = new File(local);
|
|
|
InputStream in = null;
|
|
|
try {
|
|
|
if (!localFile.exists()) {
|
|
|
return success;
|
|
|
} else {
|
|
|
in = new BufferedInputStream(new FileInputStream(localFile));
|
|
|
}
|
|
|
|
|
|
int reply = ftpClient.getReplyCode();
|
|
|
if (!FTPReply.isPositiveCompletion(reply)) {
|
|
|
ftpClient.disconnect();
|
|
|
return success;
|
|
|
}
|
|
|
createDir(remote);
|
|
|
ftpClient.changeWorkingDirectory(remote);
|
|
|
success = ftpClient.storeFile(localFile.getName(), in);
|
|
|
in.close();
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp文件上传失败!", e);
|
|
|
}
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 判断是否是目录
|
|
|
*
|
|
|
* @param fileName ftp文件路径
|
|
|
* @return true 是目录 false 不是
|
|
|
*/
|
|
|
public boolean isDir(String fileName) {
|
|
|
try {
|
|
|
//切换目录,若当前是目录则返回true,否则返回false。
|
|
|
return ftpClient.changeWorkingDirectory(fileName);
|
|
|
} catch (Exception e) {
|
|
|
LogService.getLogger().error("Ftp判断是否是目录失败!", e);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 递归创建远程服务器目录
|
|
|
*
|
|
|
* @param remote 远程服务器文件绝对路径
|
|
|
* @return 目录创建是否成功
|
|
|
* @throws IOException
|
|
|
*/
|
|
|
public boolean createDir(String remote) throws IOException {
|
|
|
boolean success = true;
|
|
|
String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
|
|
|
// 如果远程目录不存在,则递归创建远程服务器目录
|
|
|
if (!directory.equalsIgnoreCase("/")
|
|
|
&& !ftpClient.changeWorkingDirectory(new String(directory))) {
|
|
|
int start = 0;
|
|
|
int end = 0;
|
|
|
if (directory.startsWith("/")) {
|
|
|
start = 1;
|
|
|
} else {
|
|
|
start = 0;
|
|
|
}
|
|
|
end = directory.indexOf("/", start);
|
|
|
while (true) {
|
|
|
String subDirectory = new String(remote.substring(start, end));
|
|
|
if (!ftpClient.changeWorkingDirectory(subDirectory)) {
|
|
|
if (ftpClient.makeDirectory(subDirectory)) {
|
|
|
ftpClient.changeWorkingDirectory(subDirectory);
|
|
|
} else {
|
|
|
LogService.getLogger().debug("创建Ftp目录失败");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
start = end + 1;
|
|
|
end = directory.indexOf("/", start);
|
|
|
// 检查所有目录是否创建完毕
|
|
|
if (end <= start) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 删除文件-FTP方式
|
|
|
*
|
|
|
* @param path FTP服务器上传地址
|
|
|
* @param fileName FTP服务器上要删除的文件名
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean deleteFile(String path, String fileName) {
|
|
|
boolean success = false;
|
|
|
try {
|
|
|
ftpClient.changeWorkingDirectory(path);//转移到指定FTP服务器目录
|
|
|
ftpClient.deleteFile(fileName);
|
|
|
ftpClient.logout();
|
|
|
success = true;
|
|
|
} catch (Exception e) {
|
|
|
LogService.getLogger().error("Ftp文件删除失败!", e);
|
|
|
}
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 下载ftp文件夹
|
|
|
*
|
|
|
* @param ftpFileName ftp文件或文件夹名
|
|
|
* @param localDir 本地保存路径
|
|
|
*/
|
|
|
private boolean downDir(String ftpFileName, String localDir) {
|
|
|
boolean success = false;
|
|
|
try {
|
|
|
File file = new File(ftpFileName);
|
|
|
File temp = new File(localDir);
|
|
|
if (!temp.exists()) {
|
|
|
temp.mkdirs();
|
|
|
}
|
|
|
// 判断是否是目录
|
|
|
if (isDir(ftpFileName)) {
|
|
|
String dirPath = localDir + "/" + ftpFileName;
|
|
|
File dirFile = new File(dirPath);
|
|
|
if (!dirFile.exists()) {
|
|
|
dirFile.mkdirs();
|
|
|
}
|
|
|
String[] names = ftpClient.listNames();
|
|
|
for (int i = 0; i < names.length; i++) {
|
|
|
if (isDir(names[i])) {
|
|
|
downDir(ftpFileName + '/' + names[i], dirPath
|
|
|
+ File.separator + names[i]);
|
|
|
ftpClient.changeToParentDirectory();
|
|
|
} else {
|
|
|
File localfile = new File(dirPath + File.separator
|
|
|
+ names[i]);
|
|
|
if (!localfile.exists()) {
|
|
|
fos = new FileOutputStream(localfile);
|
|
|
ftpClient.retrieveFile(names[i], fos);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
|
|
|
File localfile = new File(localDir + File.separator + file.getName());
|
|
|
if (!localfile.exists()) {
|
|
|
fos = new FileOutputStream(localfile);
|
|
|
success = ftpClient.retrieveFile(ftpFileName, fos);
|
|
|
|
|
|
}
|
|
|
ftpClient.changeToParentDirectory();
|
|
|
}
|
|
|
} catch (SocketException e) {
|
|
|
LogService.getLogger().error("Ftp服务器连接异常!", e);
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp文件下载失败!", e);
|
|
|
}
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 上传文件夹或文件至ftp
|
|
|
*
|
|
|
* @param filename 要上传的文件
|
|
|
* @param uploadpath ftp文件路径
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public boolean uploadDir(String filename, String uploadpath) {
|
|
|
boolean success = false;
|
|
|
File file = new File(filename);
|
|
|
try {
|
|
|
|
|
|
|
|
|
// 要上传的是否存在
|
|
|
if (!file.exists()) {
|
|
|
return success;
|
|
|
}
|
|
|
// 要上传的是否是文件夹
|
|
|
if (!file.isDirectory()) {
|
|
|
return uploadFile(filename, uploadpath);
|
|
|
}
|
|
|
File[] flles = file.listFiles();
|
|
|
if (flles!=null){
|
|
|
for (File files : flles) {
|
|
|
if (files.exists()) {
|
|
|
if (files.isDirectory()) {
|
|
|
uploadDir(files.getAbsoluteFile().toString(),
|
|
|
uploadpath);
|
|
|
} else {
|
|
|
String local = files.getCanonicalPath().replaceAll("\\\\", "/");
|
|
|
String remote = uploadpath + local.substring(local.indexOf("/") + 1, local.lastIndexOf("/") + 1);
|
|
|
ftpClient.changeWorkingDirectory("/");
|
|
|
uploadFile(local, remote);
|
|
|
ftpClient.changeWorkingDirectory("/");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp文件上传失败!", e);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 读取病人信息并封装成List<String>
|
|
|
*
|
|
|
* @param path 远程ftp文件路径
|
|
|
* @return List<String>病人信息集合
|
|
|
*/
|
|
|
public List<String> readFileData(String path) {
|
|
|
connect();
|
|
|
List<String> list = new ArrayList<>();
|
|
|
InputStream inputStream = null;
|
|
|
|
|
|
try {
|
|
|
ftpClient.changeWorkingDirectory(path);
|
|
|
String[] filenames = ftpClient.listNames();
|
|
|
if (filenames != null && filenames.length > 0) {
|
|
|
for (String filenanme : filenames) {
|
|
|
inputStream = ftpClient.retrieveFileStream(path + "/" + filenanme);
|
|
|
if (inputStream==null){
|
|
|
LogService.getLogger().info("读取Ftp文件路径错误:" + (path + "/" + filenanme));
|
|
|
return list;
|
|
|
}//流为null,文件读取失败
|
|
|
String json = FileUtil.streamToBase64String(inputStream);
|
|
|
list.add(json);
|
|
|
inputStream.close();
|
|
|
ftpClient.completePendingCommand();
|
|
|
}
|
|
|
}
|
|
|
} catch (SocketException e) {
|
|
|
LogService.getLogger().error("Ftp服务器异常!", e);
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp文件读取失败!", e);
|
|
|
}finally {
|
|
|
closeConnect();
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 获取病人列表信息
|
|
|
*
|
|
|
* @param basePath 根目录下病人数据文件夹 eg:/home/test/patient/
|
|
|
* @param agencyNo 机构编码
|
|
|
* @return 病人信息map集合
|
|
|
*/
|
|
|
public List<Map<String, String>> getPatientList(String basePath, String agencyNo) {
|
|
|
connect();
|
|
|
List<Map<String, String>> list = new ArrayList<>();
|
|
|
Map<String, String> map = null;
|
|
|
String base = basePath + agencyNo;
|
|
|
try {
|
|
|
ftpClient.changeWorkingDirectory(base);//病人ID集合
|
|
|
int reply = ftpClient.getReplyCode();
|
|
|
if (FTPReply.isPositiveCompletion(reply)) {
|
|
|
String[] patientnames = ftpClient.listNames();
|
|
|
if (patientnames != null && patientnames.length > 0) {
|
|
|
for (String patientname : patientnames) {
|
|
|
String jsonPath = base + "/" + patientname;//json文件夹
|
|
|
ftpClient.changeWorkingDirectory(jsonPath);
|
|
|
String[] eventNames = ftpClient.listNames();//获取json文件遍历
|
|
|
for (String event : eventNames) {
|
|
|
map = new HashMap<>();
|
|
|
map.put("agency_code", agencyNo);
|
|
|
map.put("patient_id", patientname);
|
|
|
map.put("event_no", event);
|
|
|
list.add(map);
|
|
|
}
|
|
|
// ftpClient.changeWorkingDirectory("..");
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
LogService.getLogger().debug("agency编码:" + agencyNo + " 对应的数据不存在,获取病人列表信息失败");
|
|
|
}
|
|
|
} catch (SocketException e) {
|
|
|
LogService.getLogger().error("Ftp-服务器连接失败!", e);
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp-获取病人数据失败!", e);
|
|
|
}finally {
|
|
|
closeConnect();
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 清空文件夹中文件
|
|
|
* @param pathname ftp文件夹路径
|
|
|
* @return
|
|
|
*/
|
|
|
public boolean removeData(String pathname) {
|
|
|
try {
|
|
|
FTPFile[] files = ftpClient.listFiles(pathname);
|
|
|
for (FTPFile f : files) {
|
|
|
if (f.isDirectory()) {
|
|
|
removeData(pathname + "/" + f.getName());
|
|
|
ftpClient.removeDirectory(pathname);
|
|
|
}
|
|
|
if (f.isFile()) {
|
|
|
ftpClient.deleteFile(pathname + "/" + f.getName());
|
|
|
}
|
|
|
}
|
|
|
} catch (IOException e) {
|
|
|
LogService.getLogger().error("Ftp-清空文件夹失败!", e);
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
}
|