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()); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。