使用FTPClient上传下载文件夹

程序自动递归下载指定目录下的所有文件及子文件夹,上传时,自动递归创建服务器目录

/**

 * @author: bruce.huang

 * @createTime:2014年8月4日

 */

package com.framework.ftp;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.HashMap;

 

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 com.framework.xml.ServersFileReader;

import com.framework.xml.xmlbean.ServersBean;

 

/**

 * @author black

 * 

 */

public class FtpClient {

HashMap<String, String> map = null;

private static final Logger log = Logger.getLogger(FtpClient.class);

 

public HashMap<String, String> downLoad(String serverName) {

// "ftpServer"

map = new HashMap<String, String>();

ServersBean cfb = ServersFileReader.readServerProperty().get(serverName);

FTPClient ftp = new FTPClient();

FileOutputStream fos = null;

try {

ftp.connect(cfb.getServerIP());

ftp.login(cfb.getServerUser(), cfb.getServerPassword());

 

String remoteFileName = cfb.getServerHomeDir();

fos = new FileOutputStream(remoteFileName);

 

ftp.setBufferSize(1024);

// 设置文件类型(二进制)

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

ftp.retrieveFile(remoteFileName, fos);

 

this.downloadFiles(ftp, remoteFileName, cfb.getLocalHomeDir());

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("FTP客户端出错!", e);

} finally {

try {

if (fos != null)

fos.close();

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

try {

ftp.disconnect();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("关闭FTP连接发生异常!", e);

}

}

return map;

}

 

/************************************

* 下载远程目录

* */

private void downloadFiles(FTPClient ftp, String remoteFileName, String localPath) throws IOException {

// 转移到FTP服务器目录

ftp.changeWorkingDirectory(remoteFileName);

FTPFile[] fs = ftp.listFiles();

for (FTPFile ff : fs) {

if (ff.isDirectory()) {

downloadFiles(ftp, remoteFileName + "/" + ff.getName(), localPath + "/" + ff.getName());

} else {

File localFile = new File(localPath + "/" + ff.getName());

if (!localFile.getParentFile().exists()) {

localFile.getParentFile().mkdirs();

}

OutputStream is = new FileOutputStream(localFile);

ftp.retrieveFile(ff.getName(), is);

map.put(ff.getName(), ff.getSize() + ""); // 放数据

log.info("ftp下载远程文件:" + remoteFileName + "/" + ff.getName() + "(字节数:" + ff.getSize() + ")" + "到" + localPath + "/" + ff.getName());

is.close();

}

}

 

}

 

public static boolean upload(String serverName) {

ServersBean serverBean = ServersFileReader.readServerProperty().get(serverName);

boolean success = false;

FTPClient ftp = new FTPClient();

try {

int reply;

ftp.connect(serverBean.getServerIP(), serverBean.getServerPort());// 连接FTP服务器

ftp.login(serverBean.getServerUser(), serverBean.getServerPassword());// 登录

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {

ftp.disconnect();

return success;

}

ftp.changeWorkingDirectory(serverBean.getServerHomeDir());

uploadFiles(ftp, serverBean.getServerHomeDir(), new File(serverBean.getLocalHomeDir()));

ftp.logout();

success = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

if (ftp.isConnected()) {

try {

ftp.disconnect();

} catch (IOException ioe) {

}

}

}

return success;

}

 

/*********************

* 上传文件或文件夹

* */

private static void uploadFiles(FTPClient ftp, String remotePath, File localFile) {

if (localFile.isDirectory()) {

for (File ff : localFile.listFiles()) {

if (ff.isDirectory()) {

try {

ftp.changeWorkingDirectory(remotePath);

if (!ftp.changeWorkingDirectory(remotePath + "/" + localFile.getName())) {

log.info("FTP到目录(" + remotePath + ")下创建文件夹:" + ff.getName());

ftp.makeDirectory(ff.getName());

}

uploadFiles(ftp, remotePath + "/" + ff.getName(), ff);// 递归调用,传文件夹

} catch (IOException e) {

log.error("FTP服务器创建远程目录(" + remotePath + "/" + ff.getName() + ")失败:" + e.getMessage());

}

} else {

uploadFile(ftp, remotePath, ff);

}

}

} else {

uploadFile(ftp, remotePath, localFile);

}

}

 

/*****************************************

* 上传单个文件

* */

private static void uploadFile(FTPClient ftp, String remotePath, File localFile) {

try {

log.info("开始上传文件到:" + remotePath + "/==" + localFile.getName());

ftp.changeWorkingDirectory(remotePath);

ftp.storeFile(localFile.getName(), new FileInputStream(localFile));

} catch (IOException e) {

log.error("FTP向服务器(" + ftp.getRemoteAddress().getHostAddress() + ")上传文件(" + localFile.getAbsolutePath() + ")失败:" + e.getMessage());

}

}

}

 

 

 

文件引用的服务对象

/**

 * @author: bruce.huang

 * @createTime:2014年7月27日

 */

package com.framework.xml.xmlbean;

 

/**

 * @author black

 * 

 */

public class ServersBean {

private String name;

private String description;

private String serverIP;

private int serverPort;

private String serverUser;

private String serverPassword;

private String serverHomeDir;

private String localHomeDir;

 

public String getLocalHomeDir() {

return localHomeDir;

}

public void setLocalHomeDir(String localHomeDir) {

this.localHomeDir = localHomeDir;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getServerIP() {

return serverIP;

}

public void setServerIP(String serverIP) {

this.serverIP = serverIP;

}

public int getServerPort() {

return serverPort;

}

public void setServerPort(int serverPort) {

this.serverPort = serverPort;

}

public String getServerUser() {

return serverUser;

}

public void setServerUser(String serverUser) {

this.serverUser = serverUser;

}

public String getServerPassword() {

return serverPassword;

}

public void setServerPassword(String serverPassword) {

this.serverPassword = serverPassword;

}

public String getServerHomeDir() {

return serverHomeDir;

}

public void setServerHomeDir(String serverHomeDir) {

this.serverHomeDir = serverHomeDir;

}

}

 

 

 

 

链接到sFTP客户端谷歌浏览器应用程序 访问您的本地/远程FTP服务器(包括您的NAS驱动器),本地服务器,VPS,专用服务器,云服务器或共享主机。 我们现在已经发布了适用于MAC,WINDOWS和LINUX的本地应用程序,请访问我们的网站: http://www.sftpclient.io/download ------------------------------------------ sFTP客户端是简单的,它是建立在谷歌浏览器/ Chrome操作系统打包的应用程序界面,使应用程序快速和响应。其中一些功能包括一个FTP / SFTP帐户管理器,用于存储和管理最常用和最喜欢的FTP / SFTP连接,只需点击一下,文件/文件夹队列即可查看当前正在上传/下载的项目,强大的文本编辑器(所以你甚至不需要额外的程序来修改你的代码),等等... 看看下面的sFTP客户端应用程序的所有功能。 特征: ========= - 标准的FTP连接 - SSH over File Transfer Protocol(sFTP)连接 - 用于SSH连接的权限密钥文件(SSH密钥 - RSA) - FTP / SFTP被动模式 - 连接到远程(外部)和本地(内部)FTP / SFTP / SSH服务器。 - 更改文件/文件夹权限(通过复选框或值:例如777) - 上传/下载多个文件和文件夹 - 快速连接 - 编辑器选项:选项卡式文件,自定义 - 拖放文件/文件夹 - 管理FTP / SFTP / SSH账户(使用谷歌浏览器本地存储和安全密码加密存储) - 强大的文本编辑器,语法高亮(保存,自动保存和自动上传功能) - 键盘选择(向上,向下,进入(回车)和退出(退格)的目录,包括搜索能力,通过键盘上键入快速访问文件/文件夹) - 导入帐户:sFTP客户端 - 出口帐户 - 重命名和删除文件 - 创建新的文件/目录 - 刷新本地和远程列表 - 对列进行排序和调整大小 - 多选文件和文件夹 - 按路径浏览本地和远程文件夹 - 本地目录:选择每个连接的默认本地目录,假设为全局 - 快速帐户菜单(一键从您保存的列表中打开FTP / SFTP / SSH帐户连接) - 多个FTP / SFTP / SSH帐户连接(如果您打开了大量连接,则滚动选项卡) - 关闭连接(断开与服务器的连接并删除所有活动) - 控制台日志(显示所有FTP / SFTP / SSH活动日志) - 传输队列(排队的文件和文件夹,失败的文件和文件夹,完成的文件和文件夹) - 新的Google Sockets API - 远程和本地菜单 - 连接并列出UNIX和MS-DOS目录 - 复制网址到剪贴板 - 10最近的连接 - 保持连接 - 主密码登录(保持所有的FTP连接安全,1登录) - 同步浏览 更多的功能和功能来免费未来的更新! 支持语言:English (UK)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值