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