JAVA实现FTP断点上传的方法
本文实例讲述了JAVA实现FTP断点上传的方法。分享给大家供大家参考。具体分析如下:
这里主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importorg.apache.commons.net.PrintCommandListener;
importorg.apache.commons.net.ftp.FTP;
importorg.apache.commons.net.ftp.FTPClient;
importorg.apache.commons.net.ftp.FTPFile;
importorg.apache.commons.net.ftp.FTPReply;
publicclassContinueFTP{
privateFTPClientftpClient=newFTPClient();
publicContinueFTP(){
//设置将过程中使用到的命令输出到控制台
this.ftpClient.addProtocolCommandListener(newPrintCommandListener(newPrintWriter(System.out)));
}
/**
*java编程中用于连接到FTP服务器
*@paramhostname主机名
*@paramport端口
*@paramusername用户名
*@parampassword密码
*@return是否连接成功
*@throwsIOException
*/
publicbooleanconnect(Stringhostname,intport,Stringusername,Stringpassword)throwsIOException{
ftpClient.connect(hostname,port);
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
if(ftpClient.login(username,password)){
returntrue;
}
}
disconnect();
returnfalse;
}
/**
*从FTP服务器上下载文件
*@paramremote远程文件路径
*@paramlocal本地文件路径
*@return是否成功
*@throwsIOException
*/
publicbooleandownload(Stringremote,Stringlocal)throwsIOException{
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
booleanresult;
Filef=newFile(local);
FTPFile[]files=ftpClient.listFiles(remote);
if(files.length!=1){
System.out.println("远程文件不唯一");
returnfalse;
}
longlRemoteSize=files[0].getSize();
if(f.exists()){
OutputStreamout=newFileOutputStream(f,true);
System.out.println("本地文件大小为:"+f.length());
if(f.length()>=lRemoteSize){
System.out.println("本地文件大小大于远程文件大小,下载中止");
returnfalse;
}
ftpClient.setRestartOffset(f.length());
result=ftpClient.retrieveFile(remote,out);
out.close();
}else{
OutputStreamout=newFileOutputStream(f);
result=ftpClient.retrieveFile(remote,out);
out.close();
}
returnresult;
}
/**
*上传文件到FTP服务器,支持断点续传
*@paramlocal本地文件名称,绝对路径
*@paramremote远程文件路径,使用/home/directory1/subdirectory/file.ext按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
*@return上传结果
*@throwsIOException
*/
publicUploadStatusupload(Stringlocal,Stringremote)throwsIOException{
//设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
//设置以二进制流的方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
UploadStatusresult;
//对远程目录的处理
StringremoteFileName=remote;
if(remote.contains("/")){
remoteFileName=remote.substring(remote.lastIndexOf("/")+1);
Stringdirectory=remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){
//如果远程目录不存在,则递归创建远程服务器目录
intstart=0;
intend=0;
if(directory.startsWith("/")){
start=1;
}else{
start=0;
}
end=directory.indexOf("/",start);
while(true){
StringsubDirectory=remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else{
System.out.println("创建目录失败");
returnUploadStatus.Create_Directory_Fail;
}
}
start=end+1;
end=directory.indexOf("/",start);
//检查所有目录是否创建完毕
if(end<=start){
break;
}
}
}
}
//检查远程是否存在文件
FTPFile[]files=ftpClient.listFiles(remoteFileName);
if(files.length==1){
longremoteSize=files[0].getSize();
Filef=newFile(local);
longlocalSize=f.length();
if(remoteSize==localSize){
returnUploadStatus.File_Exits;
}elseif(remoteSize>localSize){
returnUploadStatus.Remote_Bigger_Local;
}
//尝试移动文件内读取指针,实现断点续传
InputStreamis=newFileInputStream(f);
if(is.skip(remoteSize)==remoteSize){
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote,is)){
returnUploadStatus.Upload_From_Break_Success;
}
}
//如果断点续传没有成功,则删除服务器上文件,重新上传
if(!ftpClient.deleteFile(remoteFileName)){
returnUploadStatus.Delete_Remote_Faild;
}
is=newFileInputStream(f);
if(ftpClient.storeFile(remote,is)){
result=UploadStatus.Upload_New_File_Success;
}else{
result=UploadStatus.Upload_New_File_Failed;
}
is.close();
}else{
InputStreamis=newFileInputStream(local);
if(ftpClient.storeFile(remoteFileName,is)){
result=UploadStatus.Upload_New_File_Success;
}else{
result=UploadStatus.Upload_New_File_Failed;
}
is.close();
}
returnresult;
}
/**
*断开与远程服务器的连接
*@throwsIOException
*/
publicvoiddisconnect()throwsIOException{
if(ftpClient.isConnected()){
ftpClient.disconnect();
}
}
publicstaticvoidmain(String[]args){
ContinueFTPmyFtp=newContinueFTP();
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(IOExceptione){
System.out.println("连接FTP出错:"+e.getMessage());
}
}
}
希望本文所述对大家的java程序设计有所帮助。