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程序设计有所帮助。