java基于Apache FTP实现文件上传、下载、修改文件名、删除
ApacheFTP是应用比较广泛的FTP上传客户端工具,它易于操作,代码简略,结构清晰,是做FTP文件客户端管理软件的优先之选。FTP的操作包括:FTP文件上传(断点续传)、FTP文件下载、FTP文件重命名、FTP文件删除,这些操作已经将FTP应用管理的方式发挥的淋漓尽致了,So我一直都用此种方式来实现FTP文件服务器的管理工作;下附FTP工具代码。
1、FTP文件操作状态枚举类
packagecom.scengine.wtms.utils.ftp; publicenumFTPStatus { 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_local(12),Not_Exist_File(13),Remote_Rename_Success(14),Remote_Rename_Faild(15),File_Not_Unique(16); privateintstatus; publicintgetStatus() { returnstatus; } publicvoidsetStatus(intstatus) { this.status=status; } FTPStatus(intstatus) { this.status=status; } }
2、FTP文件操作工具代码
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; importjavax.servlet.http.HttpServletResponse; 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; importcom.scengine.wtms.utils.Log; publicclassFTPUtils { privateFTPClientftpClient=newFTPClient(); /** *对象构造设置将过程中使用到的命令输出到控制台 */ publicFTPUtils() { 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 *远程文件路径 *@return *@throwsIOException */ publicFTPStatusdelete(Stringremote)throwsIOException { ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FTPStatusresult=null; FTPFile[]files=ftpClient.listFiles(remote); if(files.length==1) { booleanstatus=ftpClient.deleteFile(remote); result=status?FTPStatus.Delete_Remote_Success:FTPStatus.Delete_Remote_Faild; } else { result=FTPStatus.Not_Exist_File; } Log.getLogger(this.getClass()).info("FTP服务器文件删除标识:"+result); returnresult; } /** *重命名远程FTP文件 * *@paramname *新远程文件名称(路径-必须保证在同一路径下) * *@paramremote *远程文件路径 * *@return是否成功 * *@throwsIOException */ publicFTPStatusrename(Stringname,Stringremote)throwsIOException { ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FTPStatusresult=null; FTPFile[]files=ftpClient.listFiles(remote); if(files.length==1) { booleanstatus=ftpClient.rename(remote,name); result=status?FTPStatus.Remote_Rename_Success:FTPStatus.Remote_Rename_Faild; } else { result=FTPStatus.Not_Exist_File; } Log.getLogger(this.getClass()).info("FTP服务器文件名更新标识:"+result); returnresult; } /** * *从FTP服务器上下载文件 * *@paramfileName *下载文件的名字(包括后缀名) * *@paramremote *远程文件路径 * *@paramlocal *本地文件路径 * *@return是否成功 * *@throwsIOException */ publicFTPStatusdownload(StringfileName,Stringremote,HttpServletResponseresponse)throwsIOException { //开启输出流弹出文件保存路径选择窗口 response.setContentType("application/octet-stream"); response.setContentType("application/OCTET-STREAM;charset=UTF-8"); response.setHeader("Content-Disposition","attachment;filename="+fileName); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FTPStatusresult; OutputStreamout=response.getOutputStream(); booleanstatus=ftpClient.retrieveFile(remote,out); result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild; Log.getLogger(this.getClass()).info("FTP服务器文件下载标识:"+result); out.close(); returnresult; } /** * *从FTP服务器上下载文件 * *@paramremote *远程文件路径 * *@paramlocal *本地文件路径 * *@return是否成功 * *@throwsIOException */ @SuppressWarnings("resource") publicFTPStatusdownload(Stringremote,Stringlocal)throwsIOException { ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FTPStatusresult; Filef=newFile(local); FTPFile[]files=ftpClient.listFiles(remote); if(files.length!=1) { Log.getLogger(this.getClass()).info("远程文件不唯一"); returnFTPStatus.File_Not_Unique; } longlRemoteSize=files[0].getSize(); if(f.exists()) { OutputStreamout=newFileOutputStream(f,true); Log.getLogger(this.getClass()).info("本地文件大小为:"+f.length()); if(f.length()>=lRemoteSize) { Log.getLogger(this.getClass()).info("本地文件大小大于远程文件大小,下载中止"); returnFTPStatus.Remote_smaller_local; } ftpClient.setRestartOffset(f.length()); booleanstatus=ftpClient.retrieveFile(remote,out); result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild; out.close(); }else { OutputStreamout=newFileOutputStream(f); booleanstatus=ftpClient.retrieveFile(remote,out); result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild; out.close(); } returnresult; } /** * *上传文件到FTP服务器,支持断点续传 * *@paramlocal *本地文件名称,绝对路径 * *@paramremote *远程文件路径,使用/home/directory1/subdirectory/file.ext *按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * *@return上传结果 * *@throwsIOException */ @SuppressWarnings("resource") publicFTPStatusupload(Stringlocal,Stringremote)throwsIOException { //设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); //设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FTPStatusresult; //对远程目录的处理 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 { Log.getLogger(this.getClass()).info("创建目录失败"); returnFTPStatus.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) { returnFTPStatus.File_Exits; }elseif(remoteSize>localSize) { returnFTPStatus.Remote_Bigger_Local; } //尝试移动文件内读取指针,实现断点续传 InputStreamis=newFileInputStream(f); if(is.skip(remoteSize)==remoteSize) { ftpClient.setRestartOffset(remoteSize); if(ftpClient.storeFile(remote,is)) { returnFTPStatus.Upload_From_Break_Success; } } //如果断点续传没有成功,则删除服务器上文件,重新上传 if(!ftpClient.deleteFile(remoteFileName)) { returnFTPStatus.Delete_Remote_Faild; } is=newFileInputStream(f); if(ftpClient.storeFile(remote,is)) { result=FTPStatus.Upload_New_File_Success; }else { result=FTPStatus.Upload_New_File_Failed; } is.close(); }else { InputStreamis=newFileInputStream(local); if(ftpClient.storeFile(remoteFileName,is)) { result=FTPStatus.Upload_New_File_Success; }else { result=FTPStatus.Upload_New_File_Failed; } is.close(); } returnresult; } /** * *断开与远程服务器的连接 * *@throwsIOException */ publicvoiddisconnect()throwsIOException { if(ftpClient.isConnected()) { ftpClient.disconnect(); } } publicstaticvoidmain(String[]args) { FTPUtilsmyFtp=newFTPUtils(); try { myFtp.connect("192.168.1.200",21,"duser","HTPDuserXP32"); Log.getLogger(FTPUtils.class).info(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar","/jars/swing.drawer.jar")); myFtp.disconnect(); }catch(IOExceptione) { Log.getLogger(FTPUtils.class).info("FTP上传文件异常:"+e.getMessage()); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。