編輯:關於Android編程
Android中使用的FTP上傳、下載,含有進度。
代碼部分主要分為三個文件:MainActivity,FTP,ProgressInputStream
1. MainActivity
package com.ftp; import java.io.File; import java.io.IOException; import java.util.LinkedList; import com.ftp.FTP.DeleteFileProgressListener; import com.ftp.FTP.DownLoadProgressListener; import com.ftp.FTP.UploadProgressListener; import android.app.Activity; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; public static final String FTP_CONNECT_SUCCESSS = "ftp連接成功"; public static final String FTP_CONNECT_FAIL = "ftp連接失敗"; public static final String FTP_DISCONNECT_SUCCESS = "ftp斷開連接"; public static final String FTP_FILE_NOTEXISTS = "ftp上文件不存在"; public static final String FTP_UPLOAD_SUCCESS = "ftp文件上傳成功"; public static final String FTP_UPLOAD_FAIL = "ftp文件上傳失敗"; public static final String FTP_UPLOAD_LOADING = "ftp文件正在上傳"; public static final String FTP_DOWN_LOADING = "ftp文件正在下載"; public static final String FTP_DOWN_SUCCESS = "ftp文件下載成功"; public static final String FTP_DOWN_FAIL = "ftp文件下載失敗"; public static final String FTP_DELETEFILE_SUCCESS = "ftp文件刪除成功"; public static final String FTP_DELETEFILE_FAIL = "ftp文件刪除失敗"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } private void initView() { //上傳功能 //new FTP().uploadMultiFile為多文件上傳 //new FTP().uploadSingleFile為單文件上傳 Button buttonUpload = (Button) findViewById(R.id.button_upload); buttonUpload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 上傳 File file = new File("/mnt/sdcard/ftpTest.docx"); try { //單文件上傳 new FTP().uploadSingleFile(file, "/fff",new UploadProgressListener(){ @Override public void onUploadProgress(String currentStep,long uploadSize,File file) { // TODO Auto-generated method stub Log.d(TAG, currentStep); if(currentStep.equals(MainActivity.FTP_UPLOAD_SUCCESS)){ Log.d(TAG, "-----shanchuan--successful"); } else if(currentStep.equals(MainActivity.FTP_UPLOAD_LOADING)){ long fize = file.length(); float num = (float)uploadSize / (float)fize; int result = (int)(num * 100); Log.d(TAG, "-----shangchuan---"+result + "%"); } } }); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); //下載功能 Button buttonDown = (Button)findViewById(R.id.button_down); buttonDown.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 下載 try { //單文件下載 new FTP().downloadSingleFile("/fff/ftpTest.docx","/mnt/sdcard/download/","ftpTest.docx",new DownLoadProgressListener(){ @Override public void onDownLoadProgress(String currentStep, long downProcess, File file) { Log.d(TAG, currentStep); if(currentStep.equals(MainActivity.FTP_DOWN_SUCCESS)){ Log.d(TAG, "-----xiazai--successful"); } else if(currentStep.equals(MainActivity.FTP_DOWN_LOADING)){ Log.d(TAG, "-----xiazai---"+downProcess + "%"); } } }); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); //刪除功能 Button buttonDelete = (Button)findViewById(R.id.button_delete); buttonDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 刪除 try { new FTP().deleteSingleFile("/fff/ftpTest.docx",new DeleteFileProgressListener(){ @Override public void onDeleteProgress(String currentStep) { Log.d(TAG, currentStep); if(currentStep.equals(MainActivity.FTP_DELETEFILE_SUCCESS)){ Log.d(TAG, "-----shanchu--success"); } else if(currentStep.equals(MainActivity.FTP_DELETEFILE_FAIL)){ Log.d(TAG, "-----shanchu--fail"); } } }); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); } }
2. FTP
package com.ftp; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.LinkedList; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; public class FTP { /** * 服務器名. */ private String hostName; /** * 端口號 */ private int serverPort; /** * 用戶名. */ private String userName; /** * 密碼. */ private String password; /** * FTP連接. */ private FTPClient ftpClient; public FTP() { this.hostName = "192.168.1.101"; this.serverPort = 21; this.userName = "admin"; this.password = "1234"; this.ftpClient = new FTPClient(); } // -------------------------------------------------------文件上傳方法------------------------------------------------ /** * 上傳單個文件. * * @param localFile * 本地文件 * @param remotePath * FTP目錄 * @param listener * 監聽器 * @throws IOException */ public void uploadSingleFile(File singleFile, String remotePath, UploadProgressListener listener) throws IOException { // 上傳之前初始化 this.uploadBeforeOperate(remotePath, listener); boolean flag; 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); } /** * 上傳多個文件. * * @param localFile * 本地文件 * @param remotePath * FTP目錄 * @param listener * 監聽器 * @throws IOException */ public void uploadMultiFile(LinkedList<File> fileList, String remotePath, UploadProgressListener listener) throws IOException { // 上傳之前初始化 this.uploadBeforeOperate(remotePath, listener); boolean flag; for (File singleFile : 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); } /** * 上傳單個文件. * * @param localFile * 本地文件 * @return true上傳成功, false上傳失敗 * @throws IOException */ private boolean uploadingSingle(File localFile, UploadProgressListener listener) throws IOException { boolean flag = true; // 不帶進度的方式 // // 創建輸入流 // InputStream inputStream = new FileInputStream(localFile); // // 上傳單個文件 // flag = ftpClient.storeFile(localFile.getName(), inputStream); // // 關閉文件流 // inputStream.close(); // 帶有進度的方式 BufferedInputStream buffIn = new BufferedInputStream( new FileInputStream(localFile)); ProgressInputStream progressInput = new ProgressInputStream(buffIn, listener, localFile); flag = ftpClient.storeFile(localFile.getName(), progressInput); buffIn.close(); return flag; } /** * 上傳文件之前初始化相關參數 * * @param remotePath * FTP目錄 * @param listener * 監聽器 * @throws IOException */ private void uploadBeforeOperate(String remotePath, UploadProgressListener listener) throws IOException { // 打開FTP服務 try { this.openConnect(); listener.onUploadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0, null); } catch (IOException e1) { 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); // 上傳單個文件 } /** * 上傳完成之後關閉連接 * * @param listener * @throws IOException */ private void uploadAfterOperate(UploadProgressListener listener) throws IOException { this.closeConnect(); listener.onUploadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null); } // -------------------------------------------------------文件下載方法------------------------------------------------ /** * 下載單個文件,可實現斷點下載. * * @param serverPath * Ftp目錄及文件路徑 * @param localPath * 本地目錄 * @param fileName * 下載之後的文件名稱 * @param listener * 監聽器 * @throws IOException */ public void downloadSingleFile(String serverPath, String localPath, String fileName, DownLoadProgressListener listener) throws Exception { // 打開FTP服務 try { this.openConnect(); listener.onDownLoadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0, null); } catch (IOException e1) { 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; } //創建本地文件夾 File mkFile = new File(localPath); if (!mkFile.exists()) { mkFile.mkdirs(); } localPath = localPath + fileName; // 接著判斷下載的文件是否能斷點下載 long serverSize = files[0].getSize(); // 獲取遠程文件的長度 File localFile = new File(localPath); long localSize = 0; if (localFile.exists()) { localSize = localFile.length(); // 如果本地文件存在,獲取本地文件的長度 if (localSize >= serverSize) { File file = new File(localPath); file.delete(); } } // 進度 long step = serverSize / 100; long process = 0; long currentSize = 0; // 開始准備下載文件 OutputStream out = new FileOutputStream(localFile, true); ftpClient.setRestartOffset(localSize); InputStream input = ftpClient.retrieveFileStream(serverPath); byte[] b = new byte[1024]; int length = 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, new File(localPath)); } else { listener.onDownLoadProgress(MainActivity.FTP_DOWN_FAIL, 0, null); } // 下載完成之後關閉連接 this.closeConnect(); listener.onDownLoadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null); return; } // -------------------------------------------------------文件刪除方法------------------------------------------------ /** * 刪除Ftp下的文件. * * @param serverPath * Ftp目錄及文件路徑 * @param listener * 監聽器 * @throws IOException */ public void deleteSingleFile(String serverPath, DeleteFileProgressListener listener) throws Exception { // 打開FTP服務 try { this.openConnect(); listener.onDeleteProgress(MainActivity.FTP_CONNECT_SUCCESSS); } catch (IOException e1) { 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; } //進行刪除操作 boolean flag = 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服務. * * @throws IOException */ public void openConnect() throws IOException { // 中文轉碼 ftpClient.setControlEncoding("UTF-8"); int reply; // 服務器響應值 // 連接至服務器 ftpClient.connect(hostName, serverPort); // 獲取響應值 reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { // 斷開連接 ftpClient.disconnect(); throw new IOException("connect fail: " + reply); } // 登錄到服務器 ftpClient.login(userName, password); // 獲取響應值 reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { // 斷開連接 ftpClient.disconnect(); throw new IOException("connect fail: " + reply); } else { // 獲取登錄信息 FTPClientConfig config = new FTPClientConfig(ftpClient .getSystemType().split(" ")[0]); config.setServerLanguageCode("zh"); ftpClient.configure(config); // 使用被動模式設為默認 ftpClient.enterLocalPassiveMode(); // 二進制文件支持 ftpClient .setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE); } } /** * 關閉FTP服務. * * @throws IOException */ public void closeConnect() throws IOException { if (ftpClient != null) { // 退出FTP ftpClient.logout(); // 斷開連接 ftpClient.disconnect(); } } // ---------------------------------------------------上傳、下載、刪除監聽--------------------------------------------- /* * 上傳進度監聽 */ public interface UploadProgressListener { public void onUploadProgress(String currentStep, long uploadSize, File file); } /* * 下載進度監聽 */ public interface DownLoadProgressListener { public void onDownLoadProgress(String currentStep, long downProcess, File file); } /* * 文件刪除監聽 */ public interface DeleteFileProgressListener { public void onDeleteProgress(String currentStep); } }
3. ProgressInputStream
package com.ftp; import java.io.File; import java.io.IOException; import java.io.InputStream; import com.ftp.FTP.UploadProgressListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; public class ProgressInputStream extends InputStream { private static final int TEN_KILOBYTES = 1024 * 10; //每上傳10K返回一次 private InputStream inputStream; private long progress; private long lastUpdate; private boolean closed; private UploadProgressListener listener; private File localFile; public ProgressInputStream(InputStream inputStream,UploadProgressListener listener,File localFile) { this.inputStream = inputStream; this.progress = 0; this.lastUpdate = 0; this.listener = listener; this.localFile = localFile; this.closed = false; } @Override public int read() throws IOException { int count = inputStream.read(); return incrementCounterAndUpdateDisplay(count); } @Override public int read(byte[] b, int off, int len) throws IOException { int count = inputStream.read(b, off, len); return incrementCounterAndUpdateDisplay(count); } @Override public void close() throws IOException { super.close(); if (closed) throw new IOException("already closed"); closed = true; } private int incrementCounterAndUpdateDisplay(int count) { if (count > 0) progress += count; lastUpdate = maybeUpdateDisplay(progress, lastUpdate); return count; } private long maybeUpdateDisplay(long progress, long lastUpdate) { if (progress - lastUpdate > TEN_KILOBYTES) { lastUpdate = progress; this.listener.onUploadProgress(MainActivity.FTP_UPLOAD_LOADING, progress, this.localFile); } return lastUpdate; } }
原文鏈接:http://blog.csdn.net/tianyitianyi1/article/details/38637999
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
qq空間現在也可以打賞紅包啦啦!據了解,QQ空間打賞紅包在上個月QQ6.5版中就有了,現在打賞的最高金額是200元!那麼晚qq空間打賞功能是什麼?qq空間打
最近的項目中給ListView 加入了一個Header View之後,發現Header View的下方也有了分割線,很難看,UI要求將Header View的分割器去掉
android開發中實現單選與多選對話框的代碼非常簡單,具體代碼如下所示:public void myClick(View view) { // 單選對話框 //si
CoordinatorLayout 實現了多種Material Design中提到的滾動效果。目前這個框架提供了幾種不用寫動畫代碼就能工作的方法,這些效果包括: *讓浮動