在Android中跟踪FTP上传数据?

我有一个工作的FTP系统与Android,但我希望能够跟踪上传的字节,所以我可以随着上传的进行更新进度条。 这可能与Android有关吗? 现在,我正在使用org.apache.common.net.ftp ,我正在使用的代码如下。 另外,我在AsyncTask中运行它。

 package com.dronnoc.ftp.complex; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.io.CopyStreamEvent; import org.apache.commons.net.io.CopyStreamListener; import org.apache.commons.net.io.Util; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Window; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); String text = "BIGFILE"; //Big file here InputStream data = new ByteArrayInputStream(text.getBytes()); new ComplexFTPTransfer().execute(data); } private class ComplexFTPTransfer extends AsyncTask { private FTPClient ftp = null; @Override protected void onPreExecute() { super.onPreExecute(); try { ftp = new FTPClient(); ftp.connect("hostname"); } catch (SocketException e) { this.cancel(true); } catch (IOException e) { this.cancel(true); } Main.this.setProgressBarIndeterminateVisibility(true); } @Override protected Void doInBackground(InputStream... params) { if(!this.isCancelled()) { try { if(ftp.login("user", "pass")) { ftp.enterLocalPassiveMode(); InputStream item = params[0]; int streamSize = 0; while(item.read() != -1) { streamSize++; } InputStream is = new BufferedInputStream(params[0], streamSize); OutputStream os = ftp.storeFileStream("/test.txt"); Util.copyStream(is, os, streamSize, streamSize, new CopyStreamListener() { @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { publishProgress(new Long[] {totalBytesTransferred, streamSize}); } @Override public void bytesTransferred(CopyStreamEvent event) { } }); ftp.completePendingCommand(); } ftp.logout(); ftp.disconnect(); } catch (IOException e) { } catch (Exception e) { } } return null; } @Override protected void onProgressUpdate(Long[]... values) { super.onProgressUpdate(values); Log.d("UPDATE", values[0] + " of " + values[1] + " copied."); //TODO Put code here } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Main.this.setProgressBarIndeterminateVisibility(false); } } } 

我想知道的是,如果我可以运行进度条,更新每个上传的字节数? 干杯

此问题具有包含进度回调的InputStream的实现。 使用该InputStream并从该回调调用publishProgress以在文件上载期间进行增量更新。

下载此.jar文件

httpmime-4.1.1.jarcommons-net.jar

  try { FTPClient ftpClient = new FTPClient(); ftpClient.connect(InetAddress .getByName(Your host Url)); ftpClient.login(loginName, password); System.out.println("status :: " + ftpClient.getStatus()); ftpClient.changeWorkingDirectory(your directory name); ftpClient.setFileType(FTP.IMAGE_FILE_TYPE); //Your File path set here File file = new File("/sdcard/my pictures/image.png"); BufferedInputStream buffIn = new BufferedInputStream( new FileInputStream(myImageFile)); ftpClient.enterLocalPassiveMode(); ProgressInputStream progressInput = new ProgressInputStream( buffIn); boolean result = ftpClient.storeFile(UPLOADFILENAME + ".png", progressInput); System.out.println("result is :: " + result); buffIn.close(); ftpClient.logout(); ftpClient.disconnect(); } catch (Exception e) { e.printStackTrace(); } 

// ProgressInputStream

 import java.io.IOException; import java.io.InputStream; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class ProgressInputStream extends InputStream { /* Key to retrieve progress value from message bundle passed to handler */ public static final String PROGRESS_UPDATE = "progress_update"; private static final int TEN_KILOBYTES = 1024 * 40; private InputStream inputStream; //private Handler handler; private long progress; private long lastUpdate; private boolean closed; public ProgressInputStream(InputStream inputStream) { this.inputStream = inputStream; this.progress = 0; this.lastUpdate = 0; 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; sendLong(PROGRESS_UPDATE, progress); } return lastUpdate; } public void sendLong(String key, long value) { Bundle data = new Bundle(); data.putLong(key, value); Message message = Message.obtain(); message.setData(data); //handler.sendMessage(message); } } 

这可以使用安全FTP工厂库完成。

您只需要实现com.jscape.inet.ftp.FtpListener接口的实例,使用Ftp类注册实例并重载进度( FtpProgressEvent事件)方法以捕获进度信息。

JavaDoc: 概述(安全FTP工厂API)

下载: Java FTP,Java FTPS和Java SFTP组件