java终实现ftp断点上传

主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。

断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。

 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import org.apache.commons.net.PrintCommandListener; 
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; 

public class ContinueFTP { 
private FTPClient ftpClient = new FTPClient(); 

public ContinueFTP(){ 
//设置将过程中使用到的命令输出到控制台 
this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
} 

/** 
* 连接到FTP服务器 
* @param hostname 主机名 
* @param port 端口 
* @param username 用户名 
* @param password 密码 
* @return 是否连接成功 
* @throws IOException 
*/ 
public boolean connect(String hostname,int port,String username,String password) throws IOException{ 
ftpClient.connect(hostname, port); 
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ 
if(ftpClient.login(username, password)){ 
return true; 
} 
} 
disconnect(); 
return false; 
} 

/** 
* 从FTP服务器上下载文件 
* @param remote 远程文件路径 
* @param local 本地文件路径 
* @return 是否成功 
* @throws IOException 
*/ 
public boolean download(String remote,String local) throws IOException{ 
ftpClient.enterLocalPassiveMode(); 
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
boolean result; 
File f = new File(local); 
FTPFile[] files = ftpClient.listFiles(remote); 
if(files.length != 1){ 
System.out.println("远程文件不唯一"); 
return false; 
} 
long lRemoteSize = files[0].getSize(); 
if(f.exists()){ 
OutputStream out = new FileOutputStream(f,true); 
System.out.println("本地文件大小为:"+f.length()); 
if(f.length() >= lRemoteSize){ 
System.out.println("本地文件大小大于远程文件大小,下载中止"); 
return false; 
} 
ftpClient.setRestartOffset(f.length()); 
result = ftpClient.retrieveFile(remote, out); 
out.close(); 
}else { 
OutputStream out = new FileOutputStream(f); 
result = ftpClient.retrieveFile(remote, out); 
out.close(); 
} 
return result; 
} 

/** 
* 上传文件到FTP服务器,支持断点续传 
* @param local 本地文件名称,绝对路径 
* @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 
* @return 上传结果 
* @throws IOException 
*/ 
public UploadStatus upload(String local,String remote) throws IOException{ 
//设置PassiveMode传输 
ftpClient.enterLocalPassiveMode(); 
//设置以二进制流的方式传输 
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
UploadStatus result; 
//对远程目录的处理 
String remoteFileName = remote; 
if(remote.contains("/")){ 
remoteFileName = remote.substring(remote.lastIndexOf("/")+1); 
String directory = remote.substring(0,remote.lastIndexOf("/")+1); 
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){ 
//如果远程目录不存在,则递归创建远程服务器目录 
int start=0; 
int end = 0; 
if(directory.startsWith("/")){ 
start = 1; 
}else{ 
start = 0; 
} 
end = directory.indexOf("/",start); 
while(true){ 
String subDirectory = remote.substring(start,end); 
if(!ftpClient.changeWorkingDirectory(subDirectory)){ 
if(ftpClient.makeDirectory(subDirectory)){ 
ftpClient.changeWorkingDirectory(subDirectory); 
}else { 
System.out.println("创建目录失败"); 
return UploadStatus.Create_Directory_Fail; 
} 
} 

start = end + 1; 
end = directory.indexOf("/",start); 

//检查所有目录是否创建完毕 
if(end <= start){ 
break; 
} 
} 
} 
} 

//检查远程是否存在文件 
FTPFile[] files = ftpClient.listFiles(remoteFileName); 
if(files.length == 1){ 
long remoteSize = files[0].getSize(); 
File f = new File(local); 
long localSize = f.length(); 
if(remoteSize==localSize){ 
return UploadStatus.File_Exits; 
}else if(remoteSize > localSize){ 
return UploadStatus.Remote_Bigger_Local; 
} 

//尝试移动文件内读取指针,实现断点续传 
InputStream is = new FileInputStream(f); 
if(is.skip(remoteSize)==remoteSize){ 
ftpClient.setRestartOffset(remoteSize); 
if(ftpClient.storeFile(remote, is)){ 
return UploadStatus.Upload_From_Break_Success; 
} 
} 

//如果断点续传没有成功,则删除服务器上文件,重新上传 
if(!ftpClient.deleteFile(remoteFileName)){ 
return UploadStatus.Delete_Remote_Faild; 
} 
is = new FileInputStream(f); 
if(ftpClient.storeFile(remote, is)){ 
result = UploadStatus.Upload_New_File_Success; 
}else{ 
result = UploadStatus.Upload_New_File_Failed; 
} 
is.close(); 
}else { 
InputStream is = new FileInputStream(local); 
if(ftpClient.storeFile(remoteFileName, is)){ 
result = UploadStatus.Upload_New_File_Success; 
}else{ 
result = UploadStatus.Upload_New_File_Failed; 
} 
is.close(); 
} 
return result; 
} 
/** 
* 断开与远程服务器的连接 
* @throws IOException 
*/ 
public void disconnect() throws IOException{ 
if(ftpClient.isConnected()){ 
ftpClient.disconnect(); 
} 
} 

public static void main(String[] args) { 
ContinueFTP myFtp = new ContinueFTP(); 
try { 
myFtp.connect("192.168.21.171", 21, "test", "test"); 
System.out.println(myFtp.upload("E://VP6.flv", "/MIS/video/VP6.flv")); 
myFtp.disconnect(); 
} catch (IOException e) { 
System.out.println("连接FTP出错:"+e.getMessage()); 
} 
} 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值