Android中FTP上传、下载的功能实现(含进度)
Android中使用的FTP上传、下载,含有进度。
代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream
1.MainActivity
packagecom.ftp; importjava.io.File; importjava.io.IOException; importjava.util.LinkedList; importcom.ftp.FTP.DeleteFileProgressListener; importcom.ftp.FTP.DownLoadProgressListener; importcom.ftp.FTP.UploadProgressListener; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Message; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ privatestaticfinalStringTAG="MainActivity"; publicstaticfinalStringFTP_CONNECT_SUCCESSS="ftp连接成功"; publicstaticfinalStringFTP_CONNECT_FAIL="ftp连接失败"; publicstaticfinalStringFTP_DISCONNECT_SUCCESS="ftp断开连接"; publicstaticfinalStringFTP_FILE_NOTEXISTS="ftp上文件不存在"; publicstaticfinalStringFTP_UPLOAD_SUCCESS="ftp文件上传成功"; publicstaticfinalStringFTP_UPLOAD_FAIL="ftp文件上传失败"; publicstaticfinalStringFTP_UPLOAD_LOADING="ftp文件正在上传"; publicstaticfinalStringFTP_DOWN_LOADING="ftp文件正在下载"; publicstaticfinalStringFTP_DOWN_SUCCESS="ftp文件下载成功"; publicstaticfinalStringFTP_DOWN_FAIL="ftp文件下载失败"; publicstaticfinalStringFTP_DELETEFILE_SUCCESS="ftp文件删除成功"; publicstaticfinalStringFTP_DELETEFILE_FAIL="ftp文件删除失败"; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } privatevoidinitView(){ //上传功能 //newFTP().uploadMultiFile为多文件上传 //newFTP().uploadSingleFile为单文件上传 ButtonbuttonUpload=(Button)findViewById(R.id.button_upload); buttonUpload.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ newThread(newRunnable(){ @Override publicvoidrun(){ //上传 Filefile=newFile("/mnt/sdcard/ftpTest.docx"); try{ //单文件上传 newFTP().uploadSingleFile(file,"/fff",newUploadProgressListener(){ @Override publicvoidonUploadProgress(StringcurrentStep,longuploadSize,Filefile){ //TODOAuto-generatedmethodstub Log.d(TAG,currentStep); if(currentStep.equals(MainActivity.FTP_UPLOAD_SUCCESS)){ Log.d(TAG,"-----shanchuan--successful"); }elseif(currentStep.equals(MainActivity.FTP_UPLOAD_LOADING)){ longfize=file.length(); floatnum=(float)uploadSize/(float)fize; intresult=(int)(num*100); Log.d(TAG,"-----shangchuan---"+result+"%"); } } }); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }).start(); } }); //下载功能 ButtonbuttonDown=(Button)findViewById(R.id.button_down); buttonDown.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ newThread(newRunnable(){ @Override publicvoidrun(){ //下载 try{ //单文件下载 newFTP().downloadSingleFile("/fff/ftpTest.docx","/mnt/sdcard/download/","ftpTest.docx",newDownLoadProgressListener(){ @Override publicvoidonDownLoadProgress(StringcurrentStep,longdownProcess,Filefile){ Log.d(TAG,currentStep); if(currentStep.equals(MainActivity.FTP_DOWN_SUCCESS)){ Log.d(TAG,"-----xiazai--successful"); }elseif(currentStep.equals(MainActivity.FTP_DOWN_LOADING)){ Log.d(TAG,"-----xiazai---"+downProcess+"%"); } } }); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }).start(); } }); //删除功能 ButtonbuttonDelete=(Button)findViewById(R.id.button_delete); buttonDelete.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ newThread(newRunnable(){ @Override publicvoidrun(){ //删除 try{ newFTP().deleteSingleFile("/fff/ftpTest.docx",newDeleteFileProgressListener(){ @Override publicvoidonDeleteProgress(StringcurrentStep){ Log.d(TAG,currentStep); if(currentStep.equals(MainActivity.FTP_DELETEFILE_SUCCESS)){ Log.d(TAG,"-----shanchu--success"); }elseif(currentStep.equals(MainActivity.FTP_DELETEFILE_FAIL)){ Log.d(TAG,"-----shanchu--fail"); } } }); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }).start(); } }); } }
2.FTP
packagecom.ftp; importjava.io.BufferedInputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.util.Date; importjava.util.LinkedList; importorg.apache.commons.net.ftp.FTPClient; importorg.apache.commons.net.ftp.FTPClientConfig; importorg.apache.commons.net.ftp.FTPFile; importorg.apache.commons.net.ftp.FTPReply; publicclassFTP{ /** *服务器名. */ privateStringhostName; /** *端口号 */ privateintserverPort; /** *用户名. */ privateStringuserName; /** *密码. */ privateStringpassword; /** *FTP连接. */ privateFTPClientftpClient; publicFTP(){ this.hostName="192.168.1.101"; this.serverPort=21; this.userName="admin"; this.password="1234"; this.ftpClient=newFTPClient(); } //-------------------------------------------------------文件上传方法------------------------------------------------ /** *上传单个文件. * *@paramlocalFile *本地文件 *@paramremotePath *FTP目录 *@paramlistener *监听器 *@throwsIOException */ publicvoiduploadSingleFile(FilesingleFile,StringremotePath, UploadProgressListenerlistener)throwsIOException{ //上传之前初始化 this.uploadBeforeOperate(remotePath,listener); booleanflag; flag=uploadingSingle(singleFile,listener); if(flag){ listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS,0, singleFile); }else{ listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL,0, singleFile); } //上传完成之后关闭连接 this.uploadAfterOperate(listener); } /** *上传多个文件. * *@paramlocalFile *本地文件 *@paramremotePath *FTP目录 *@paramlistener *监听器 *@throwsIOException */ publicvoiduploadMultiFile(LinkedList<File>fileList,StringremotePath, UploadProgressListenerlistener)throwsIOException{ //上传之前初始化 this.uploadBeforeOperate(remotePath,listener); booleanflag; for(FilesingleFile:fileList){ flag=uploadingSingle(singleFile,listener); if(flag){ listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS,0, singleFile); }else{ listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL,0, singleFile); } } //上传完成之后关闭连接 this.uploadAfterOperate(listener); } /** *上传单个文件. * *@paramlocalFile *本地文件 *@returntrue上传成功,false上传失败 *@throwsIOException */ privatebooleanuploadingSingle(FilelocalFile, UploadProgressListenerlistener)throwsIOException{ booleanflag=true; //不带进度的方式 ////创建输入流 //InputStreaminputStream=newFileInputStream(localFile); ////上传单个文件 //flag=ftpClient.storeFile(localFile.getName(),inputStream); ////关闭文件流 //inputStream.close(); //带有进度的方式 BufferedInputStreambuffIn=newBufferedInputStream( newFileInputStream(localFile)); ProgressInputStreamprogressInput=newProgressInputStream(buffIn, listener,localFile); flag=ftpClient.storeFile(localFile.getName(),progressInput); buffIn.close(); returnflag; } /** *上传文件之前初始化相关参数 * *@paramremotePath *FTP目录 *@paramlistener *监听器 *@throwsIOException */ privatevoiduploadBeforeOperate(StringremotePath, UploadProgressListenerlistener)throwsIOException{ //打开FTP服务 try{ this.openConnect(); listener.onUploadProgress(MainActivity.FTP_CONNECT_SUCCESSS,0, null); }catch(IOExceptione1){ e1.printStackTrace(); listener.onUploadProgress(MainActivity.FTP_CONNECT_FAIL,0,null); return; } //设置模式 ftpClient.setFileTransferMode(org.apache.commons.net.ftp.FTP.STREAM_TRANSFER_MODE); //FTP下创建文件夹 ftpClient.makeDirectory(remotePath); //改变FTP目录 ftpClient.changeWorkingDirectory(remotePath); //上传单个文件 } /** *上传完成之后关闭连接 * *@paramlistener *@throwsIOException */ privatevoiduploadAfterOperate(UploadProgressListenerlistener) throwsIOException{ this.closeConnect(); listener.onUploadProgress(MainActivity.FTP_DISCONNECT_SUCCESS,0,null); } //-------------------------------------------------------文件下载方法------------------------------------------------ /** *下载单个文件,可实现断点下载. * *@paramserverPath *Ftp目录及文件路径 *@paramlocalPath *本地目录 *@paramfileName *下载之后的文件名称 *@paramlistener *监听器 *@throwsIOException */ publicvoiddownloadSingleFile(StringserverPath,StringlocalPath,StringfileName,DownLoadProgressListenerlistener) throwsException{ //打开FTP服务 try{ this.openConnect(); listener.onDownLoadProgress(MainActivity.FTP_CONNECT_SUCCESSS,0,null); }catch(IOExceptione1){ e1.printStackTrace(); listener.onDownLoadProgress(MainActivity.FTP_CONNECT_FAIL,0,null); return; } //先判断服务器文件是否存在 FTPFile[]files=ftpClient.listFiles(serverPath); if(files.length==0){ listener.onDownLoadProgress(MainActivity.FTP_FILE_NOTEXISTS,0,null); return; } //创建本地文件夹 FilemkFile=newFile(localPath); if(!mkFile.exists()){ mkFile.mkdirs(); } localPath=localPath+fileName; //接着判断下载的文件是否能断点下载 longserverSize=files[0].getSize();//获取远程文件的长度 FilelocalFile=newFile(localPath); longlocalSize=0; if(localFile.exists()){ localSize=localFile.length();//如果本地文件存在,获取本地文件的长度 if(localSize>=serverSize){ Filefile=newFile(localPath); file.delete(); } } //进度 longstep=serverSize/100; longprocess=0; longcurrentSize=0; //开始准备下载文件 OutputStreamout=newFileOutputStream(localFile,true); ftpClient.setRestartOffset(localSize); InputStreaminput=ftpClient.retrieveFileStream(serverPath); byte[]b=newbyte[1024]; intlength=0; while((length=input.read(b))!=-1){ out.write(b,0,length); currentSize=currentSize+length; if(currentSize/step!=process){ process=currentSize/step; if(process%5==0){//每隔%5的进度返回一次 listener.onDownLoadProgress(MainActivity.FTP_DOWN_LOADING,process,null); } } } out.flush(); out.close(); input.close(); //此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉 if(ftpClient.completePendingCommand()){ listener.onDownLoadProgress(MainActivity.FTP_DOWN_SUCCESS,0,newFile(localPath)); }else{ listener.onDownLoadProgress(MainActivity.FTP_DOWN_FAIL,0,null); } //下载完成之后关闭连接 this.closeConnect(); listener.onDownLoadProgress(MainActivity.FTP_DISCONNECT_SUCCESS,0,null); return; } //-------------------------------------------------------文件删除方法------------------------------------------------ /** *删除Ftp下的文件. * *@paramserverPath *Ftp目录及文件路径 *@paramlistener *监听器 *@throwsIOException */ publicvoiddeleteSingleFile(StringserverPath,DeleteFileProgressListenerlistener) throwsException{ //打开FTP服务 try{ this.openConnect(); listener.onDeleteProgress(MainActivity.FTP_CONNECT_SUCCESSS); }catch(IOExceptione1){ e1.printStackTrace(); listener.onDeleteProgress(MainActivity.FTP_CONNECT_FAIL); return; } //先判断服务器文件是否存在 FTPFile[]files=ftpClient.listFiles(serverPath); if(files.length==0){ listener.onDeleteProgress(MainActivity.FTP_FILE_NOTEXISTS); return; } //进行删除操作 booleanflag=true; flag=ftpClient.deleteFile(serverPath); if(flag){ listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_SUCCESS); }else{ listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_FAIL); } //删除完成之后关闭连接 this.closeConnect(); listener.onDeleteProgress(MainActivity.FTP_DISCONNECT_SUCCESS); return; } //-------------------------------------------------------打开关闭连接------------------------------------------------ /** *打开FTP服务. * *@throwsIOException */ publicvoidopenConnect()throwsIOException{ //中文转码 ftpClient.setControlEncoding("UTF-8"); intreply;//服务器响应值 //连接至服务器 ftpClient.connect(hostName,serverPort); //获取响应值 reply=ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ //断开连接 ftpClient.disconnect(); thrownewIOException("connectfail:"+reply); } //登录到服务器 ftpClient.login(userName,password); //获取响应值 reply=ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ //断开连接 ftpClient.disconnect(); thrownewIOException("connectfail:"+reply); }else{ //获取登录信息 FTPClientConfigconfig=newFTPClientConfig(ftpClient .getSystemType().split("")[0]); config.setServerLanguageCode("zh"); ftpClient.configure(config); //使用被动模式设为默认 ftpClient.enterLocalPassiveMode(); //二进制文件支持 ftpClient .setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE); } } /** *关闭FTP服务. * *@throwsIOException */ publicvoidcloseConnect()throwsIOException{ if(ftpClient!=null){ //退出FTP ftpClient.logout(); //断开连接 ftpClient.disconnect(); } } //---------------------------------------------------上传、下载、删除监听--------------------------------------------- /* *上传进度监听 */ publicinterfaceUploadProgressListener{ publicvoidonUploadProgress(StringcurrentStep,longuploadSize,Filefile); } /* *下载进度监听 */ publicinterfaceDownLoadProgressListener{ publicvoidonDownLoadProgress(StringcurrentStep,longdownProcess,Filefile); } /* *文件删除监听 */ publicinterfaceDeleteFileProgressListener{ publicvoidonDeleteProgress(StringcurrentStep); } }
3.ProgressInputStream
packagecom.ftp; importjava.io.File; importjava.io.IOException; importjava.io.InputStream; importcom.ftp.FTP.UploadProgressListener; importandroid.os.Bundle; importandroid.os.Handler; importandroid.os.Message; importandroid.util.Log; publicclassProgressInputStreamextendsInputStream{ privatestaticfinalintTEN_KILOBYTES=1024*10;//每上传10K返回一次 privateInputStreaminputStream; privatelongprogress; privatelonglastUpdate; privatebooleanclosed; privateUploadProgressListenerlistener; privateFilelocalFile; publicProgressInputStream(InputStreaminputStream,UploadProgressListenerlistener,FilelocalFile){ this.inputStream=inputStream; this.progress=0; this.lastUpdate=0; this.listener=listener; this.localFile=localFile; this.closed=false; } @Override publicintread()throwsIOException{ intcount=inputStream.read(); returnincrementCounterAndUpdateDisplay(count); } @Override publicintread(byte[]b,intoff,intlen)throwsIOException{ intcount=inputStream.read(b,off,len); returnincrementCounterAndUpdateDisplay(count); } @Override publicvoidclose()throwsIOException{ super.close(); if(closed) thrownewIOException("alreadyclosed"); closed=true; } privateintincrementCounterAndUpdateDisplay(intcount){ if(count>0) progress+=count; lastUpdate=maybeUpdateDisplay(progress,lastUpdate); returncount; } privatelongmaybeUpdateDisplay(longprogress,longlastUpdate){ if(progress-lastUpdate>TEN_KILOBYTES){ lastUpdate=progress; this.listener.onUploadProgress(MainActivity.FTP_UPLOAD_LOADING,progress,this.localFile); } returnlastUpdate; } }
原文链接:http://blog.csdn.net/tianyitianyi1/article/details/38637999
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。