本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件。
一、准备
需要引用commons-net-3.5.jar包。
使用maven导入:
commons-net
commons-net
3.5
手动下载:
二、连接FTP Server
/**
* 连接FTP Server
* @throws IOException
*/
public static final String ANONYMOUS_USER="anonymous";
private FTPClient connect(){
FTPClient client = new FTPClient();
try{
//连接FTP Server
client.connect(this.host, this.port);
//登陆
if(this.user==null||"".equals(this.user)){
//使用匿名登陆
client.login(ANONYMOUS_USER, ANONYMOUS_USER);
} else{
client.login(this.user, this.password);
}
//设置文件格式
client.setFileType(FTPClient.BINARY_FILE_TYPE);
//获取FTP Server 应答
int reply = client.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
client.disconnect();
return null;
}
//切换工作目录
changeWorkingDirectory(client);
System.out.println("===连接到FTP:"+host+":"+port);
}
catch(IOException e){
return null;
}
return client;
}
/**
* 切换工作目录,远程目录不存在时,创建目录
* @param client
* @throws IOException
*/
private void changeWorkingDirectory(FTPClient client) throws IOException{
if(this.ftpPath!=null&&!"".equals(this.ftpPath)){
Boolean ok = client.changeWorkingDirectory(this.ftpPath);
if(!ok){
//ftpPath 不存在,手动创建目录
StringTokenizer token = new StringTokenizer(this.ftpPath,"\\//");
while(token.hasMoreTokens()){
String path = token.nextToken();
client.makeDirectory(path);
client.changeWorkingDirectory(path);
}
}
}
}
/**
* 断开FTP连接
* @param ftpClient
* @throws IOException
*/
public void close(FTPClient ftpClient) throws IOException{
if(ftpClient!=null && ftpClient.isConnected()){
ftpClient.logout();
ftpClient.disconnect();
}
System.out.println("!!!断开FTP连接:"+host+":"+port);
}
host:ftp服务器ip地址
port:ftp服务器端口
user:登陆用户
password:登陆密码
登陆用户为空时,使用匿名用户登陆。
ftpPath:ftp路径,ftp路径不存在时自动创建,如果是多层目录结构,需要迭代创建目录。
三、上传文件
/**
* 上传文件
* @param targetName 上传到ftp文件名
* @param localFile 本地文件路径
* @return
*/
public Boolean upload(String targetName,String localFile){
//连接ftp server
FTPClient ftpClient = connect();
if(ftpClient==null){
System.out.println("连接FTP服务器["+host+":"+port+"]失败!");
return false;
}
File file = new File(localFile);
//设置上传后文件名
if(targetName==null||"".equals(targetName))
targetName = file.getName();
FileInputStream fis = null;
try{
long now = System.currentTimeMillis();
//开始上传文件
fis = new FileInputStream(file);
System.out.println(">>>开始上传文件:"+file.getName());
Boolean ok = ftpClient.storeFile(targetName, fis);
if(ok){
//上传成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format(">>>上传成功:大小:%s,上传时间:%d秒", formatSize(file.length()),times/1000));
} else//上传失败
System.out.println(String.format(">>>上传失败:大小:%s", formatSize(file.length())));
}
catch(IOException e){
System.err.println(String.format(">>>上传失败:大小:%s", formatSize(file.length())));
e.printStackTrace();
return false;
}
finally{
try{
if(fis!=null)
fis.close();
close(ftpClient);
}
catch(Exception e){
}
}
return true;
}
四、下载文件
/**
* 下载文件
* @param localPath 本地存放路径
* @return
*/
public int download(String localPath){
// 连接ftp server
FTPClient ftpClient = connect();
if(ftpClient==null){
System.out.println("连接FTP服务器["+host+":"+port+"]失败!");
return 0;
}
File dir = new File(localPath);
if(!dir.exists())
dir.mkdirs();
FTPFile[] ftpFiles = null;
try{
ftpFiles = ftpClient.listFiles();
if(ftpFiles==null||ftpFiles.length==0)
return 0;
}
catch(IOException e){
return 0;
}
int c = 0;
for (int i=0;i
FileOutputStream fos = null;
try{
String name = ftpFiles[i].getName();
fos = new FileOutputStream(new File(dir.getAbsolutePath()+File.separator+name));
System.out.println("<<
long now = System.currentTimeMillis();
Boolean ok = ftpClient.retrieveFile(new String(name.getBytes("UTF-8"),"ISO-8859-1"), fos);
if(ok){
//下载成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format("<<
c++;
} else{
System.out.println("<<
}
}
catch(IOException e){
System.err.println("<<
e.printStackTrace();
}
finally{
try{
if(fos!=null)
fos.close();
close(ftpClient);
}
catch(Exception e){
}
}
}
return c;
}
格式化文件大小
private static final DecimalFormat DF = new DecimalFormat("#.##");
/**
* 格式化文件大小(B,KB,MB,GB)
* @param size
* @return
*/
private String formatSize(long size){
if(size<1024){
return size + " B";
}else if(size<1024*1024){
return size/1024 + " KB";
}else if(size<1024*1024*1024){
return (size/(1024*1024)) + " MB";
}else{
double gb = size/(1024*1024*1024);
return DF.format(gb)+" GB";
}
}
五、测试
public static void main(String args[]){
FTPTest ftp = new FTPTest("192.168.1.10",21,null,null,"/temp/2016/12");
ftp.upload("newFile.rar", "D:/ftp/TeamViewerPortable.rar");
System.out.println("");
ftp.download("D:/ftp/");
}
结果
===连接到FTP:192.168.1.10:21
>>>开始上传文件:TeamViewerPortable.rar
>>>上传成功:大小:5 MB,上传时间:3秒
!!!断开FTP连接:192.168.1.10:21
===连接到FTP:192.168.1.10:21
<<
<<
!!!断开FTP连接:192.168.1.10:21
总结
以上就是本文关于java使用Apache工具集实现ftp文件传输代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!