由于公司的业务,需要讲ftp的文件进行定时批量的下载以及上传,先是将一百多万的文件下载之后进行一个小的编辑,然后再将文件上传上午,其中遇到了许多的问题,
为了形成一个备忘录,所以记着,或许对你们也有点帮助
/**
*
* 从ftp中下载文件
*
* @param ftppath
* 文件的路径
* @param fawenr
* 发文日期
* @param tongzhislx
* 表格代码 用于生成文件夹格式
*
* @return 返回的是压缩文件地址
*/
public String downFromftpAndZip(String ftpPath, String fawenr,
String tongzhislx) {
File file = null;
FTPClient client = new FTPClient();
FileOutputStream os = null;
String saveDir = "";
System.out.println("ftp的下载地址为:" + ftpPath);
if (ftpPath != null && ftpPath.length() > 0) {
int st = ftpPath.indexOf(":");
int index = st + 1 + ftpPath.substring(st + 1).indexOf(":");
int ipIndex = ftpPath.indexOf("@");
int portIndex = ftpPath.lastIndexOf(":");
// 下载的文件存放路径
String ftpUser = ftpPath.substring(st + 3, index); // "efs";
// UserName
String ftpPwd = ftpPath.substring(index + 1, ipIndex); // "efs";
// Password
String hostname = ftpPath.substring(ipIndex + 1, portIndex); // "10.50.161.9";//截取获得
// host
String str = ftpPath.substring(portIndex);
int dirIndex = str.indexOf("/");
int port = Integer.parseInt(ftpPath.substring(portIndex + 1,
dirIndex + portIndex));// 21;
saveDir = getDateFormat(fawenr);// 转为相应的时间格式
try {
logger.info("before connect connect state:"
+ client.isConnected());
client.connect(hostname, port);// 连接ftp
logger.info("after connect" + client.isConnected());
client.enterLocalPassiveMode();// 设置为被动模式
boolean loginState = client.login(ftpUser, ftpPwd);// 登录ftp
logger.info("before login" + loginState);
// int reply = 0;
// reply = client.getReplyCode();
// if (!FTPReply.isPositiveCompletion(reply)) { //
// client.disconnect();
// logger.error("服务器拒绝连接");
// return null;
//
// }
String tempPath = ftpPath.substring(dirIndex + portIndex);//
logger.info("tmeppath:" + tempPath);
// String workPath = ftpPath.substring(dirIndex + portIndex,
// ftpPath.lastIndexOf("/"));// 获取工作空间
String fileName = ftpPath
.substring(ftpPath.lastIndexOf("/") + 1);// 获取文件名称
// client.changeWorkingDirectory(workPath);// 更改工作目录
if (!loginState) {
logger.error(ftpUser + "登录ftp失败。。。");
return null;
}
String beginPath = beginDir + saveDir + "/" + tongzhislx;// 获得保存的文件夹
// 注:新添表格代码目录
// 时间:6-29
File fileDir = new File(beginPath);// 创建日期文件夹
if (!fileDir.exists()) {// 判断文件夹是否存在
fileDir.mkdirs();// 不存在,则做多级创建文件夹
}
file = new File(beginPath + "/" + fileName);// 输出文件
if (!file.exists()) {
file.createNewFile();
}
client.setBufferSize(buffere);
client.setFileType(FTPClient.BINARY_FILE_TYPE);// 使用二进制保存方式
FTPClientConfig conf = new FTPClientConfig(
FTPClientConfig.SYST_UNIX);
conf.setServerLanguageCode("zh");
os = new FileOutputStream(file);// 文件的输出
boolean flag = client.retrieveFile(new String(tempPath
.getBytes("GBK"), "ISO-8859-1"), os);// 但是觉得能下载的啊
if (!flag) {
logger.error("文件下载失败!!!");
}
os.flush();
client.logout();// 登出
} catch (SocketException e1) {
logger.error("端口号不存在,连接失败,错误信息为:", e1);
} catch (IOException e1) {
logger.error("ftp登录失败,错误信息为:", e1);
} catch (Exception e) {
logger.error("文件下载失败...错误信息为:", e);
} finally {
try {
if (os != null) {
os.close();
}
if (client != null) {
if (client.isConnected()) {
client.disconnect();// 取消链接
}
}
} catch (IOException e) {
logger.error("ftp文件流关闭异常", e);
}
}
}
if (file != null) {
logger.info(file.getAbsolutePath() + "----------下载到的地点");
return file.getAbsolutePath();
} else {
return null;
}
}
文件上传:
/**
*
* @param file
* 上传的文件或文件夹
* @param virtualPath
* 文件的虚拟路径 根目录为:document
* @throws Exception
*/
public boolean upload(File file, String virtualPath) {
FTPClient ftp=connect();//连接服务器 每次都进行连接以及关闭
boolean flag = false;
if (file.isDirectory()) {
try {
ftp.makeDirectory(file.getName());
ftp.changeWorkingDirectory(file.getName());
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
File file1 = new File(file.getPath() + "\\" + files[i]);
if (file1.isDirectory()) {
upload(file1, "");
ftp.changeToParentDirectory();
} else {
File file2 = new File(file.getPath() + "\\" + files[i]);
FileInputStream input = new FileInputStream(file2);
ftp.enterLocalPassiveMode();// 必须修改工作方式
// port()和pasv()的工作方式
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
flag = ftp.storeFile(file2.getName(), input);
input.close();
return flag;
}
}
ftp.changeWorkingDirectory("\\");
} catch (IOException e) {
logger.warn("文件上传,IO异常,错误信息为:", e);
e.printStackTrace();
return false;
}
} else {
virtualPath = virtualPath.replace("\\", "/");
String dir[] = virtualPath.split("/");
for (String string : dir) { // 创建多级文件夹
// System.out.println(string);
if (string.indexOf(".") == -1) {
try {
ftp.makeDirectory(string);
ftp.changeWorkingDirectory(string);// 改变目录
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream input = null;
try {
if (file != null && file.exists()) {
input = new FileInputStream(file);
ftp.enterLocalPassiveMode();// 必须修改工作方式 port()和pasv()的工作方式
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setBufferSize(1024);
ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
ftp.setControlEncoding("UTF-8");
if (input != null) {
flag = ftp.storeFile(file.getName(), input);
}
if (flag) {
flag = true;
} else {
flag = false;
System.out.println("文件上传失败");
}
ftp.changeWorkingDirectory("//");// 再次回到首目录
ftp.logout();
ftp.disconnect();
} else {
logger.warn("文件不存在或是不是文件");
}
} catch (IOException e) {
logger.warn("文件上传有误,IO异常,错误信息为:", e);
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
logger.warn("上传流关闭异常,", e);
}
}
}
return flag;
}
return flag;
}
上面是文件下载的与上传的代码 我说明一下一些关键的代码:
1.ftp.enterLocalPassiveMode();当你文件下载异常或是中途中断的时候,就试图加上这一句话就好
2.ftp.setFileType(FTPClient.BINARY_FILE_TYPE);如果发现你的文件上传大小为0kb,或是大小不正常,这句话是必须的,尤其是在linux的服务器中
3.ftp.setControlEncoding("UTF-8");.如果你的文件名存在中文,最后加上这一句话
4. ftp.changeWorkingDirectory("//");// 再次回到首目录