java基于Apache FTP点断续传的文件上传和下载
基于ApacheFTP实现文件上传下载工具,上传文件时需要考虑以下问题(实例是续传功能):
(1)、FTP服务器是否存在改目录,如果不存在目录则需要创建目录。
(2)、判断上传文件是否已经存在,如果存在是需要删除后再上传还是续传。
1、上传或下载状态的枚举类:
packagecom.scengine.wtms.utils.ftp;
publicenumUploadStatus
{
File_Exits(0),Create_Directory_Success(1),Create_Directory_Fail(2),Upload_From_Break_Success(3),Upload_From_Break_Faild(4),Download_From_Break_Success(5),Download_From_Break_Faild(6),Upload_New_File_Success(7),Upload_New_File_Failed(8),Delete_Remote_Success(9),Delete_Remote_Faild(10),Remote_Bigger_Local(11),Remote_smaller_locall(12);
privateintstatus;
publicintgetStatus()
{
returnstatus;
}
publicvoidsetStatus(intstatus)
{
this.status=status;
}
UploadStatus(intstatus)
{
this.status=status;
}
}
2、工具类代码:
packagecom.scengine.wtms.utils.ftp;
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
*/
@SuppressWarnings("resource")
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
*/
@SuppressWarnings("resource")
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.1.200",21,"duser","HTPDuserXP32");
System.out.println(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar","/jars/swing.drawer.jar"));
myFtp.disconnect();
}catch(IOExceptione)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。