国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中FTP上傳、下載的功能實現(含進度)

2019-12-12 04:37:42
字體:
來源:轉載
供稿:網友

 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瑞昌市| 宜兴市| 阳原县| 霍林郭勒市| 松潘县| 湛江市| 宁南县| 阿拉善左旗| 奉节县| 巴彦县| 镇雄县| 秦皇岛市| 胶南市| 凯里市| 碌曲县| 潼关县| 桦南县| 延寿县| 淮阳县| 克山县| 长武县| 周口市| 西乌| 九龙坡区| 大石桥市| 绿春县| 平定县| 慈溪市| 岑溪市| 嘉峪关市| 手游| 大连市| 怀远县| 井研县| 孟州市| 鹰潭市| 和田市| 绥中县| 定南县| 德阳市| 措勤县|