2012-01-06 3 views
4

私はアンドロイドを使ってFTPシステムを稼働させていますが、アップロードされたバイトを追跡できるようにしたいので、アップロードが進むにつれてプログレスバーを更新することができます。これはAndroidで可能ですか?今、私はorg.apache.common.net.ftpを使用しており、私が使用しているコードは以下の通りです。また、私はAsyncTaskでこれを実行しています。FTPアップロードデータをアンドロイドで追跡しますか?

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<InputStream, Long[], Void> 
    { 
     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); 
     } 
    } 
} 

私が知りたいことは、アップロードされたバイト数を更新しながらプログレスバーを実行できるかどうかです。 乾杯

+0

FTPClient'は、FTPClientだけ意志+1 –

+0

まさに私の完全なアップロードのステータスを取得できません 'ので、私は、アップロード時にプログレスバーを表示することができカント私と同じことの問題それぞれのアップロード後に情報を返しますが、1つのファイルをアップロードするときに問題が発生します。 –

+0

私の答え[ここ](http://stackoverflow.com/a/26624243/4159043)その作業を確認してください。 –

答えて

2

This質問には、進行状況コールバックを含むInputStreamの実装があります。そのInputStreamを使用して、ファイルアップロード中に増分更新のためにそのコールバックからpublishProgressを呼び出します。

2

ダウンロードこの.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); 
    } 
} 
+0

私はこれを使用しました。そして、 'count'変数に関しては、' -1'何らかの理論しか返さないのですか? –

+0

@BlackWraith私はあなたの入力ストリームがnull PLZの最初のチェックをするかもしれないと思う。 –

1

これは、セキュアFTP工場ライブラリを使用して行うことができます。

com.jscape.inet.ftp.FtpListenerインターフェイスのインスタンスを実装し、Ftpクラスでインスタンスを登録し、進捗情報を取得するために進捗状況(FtpProgressEventイベント)をオーバーロードするだけで済みます。

のJavaDoc:Overview (secure FTP Factory API)

ダウンロード:Java FTP, Java FTPS and Java SFTP Components

+0

これは有望だと思いますが、無料のバージョンはありますか?私は、1つのアプリケーションで1回の使用で600ドルを払う気がしません。 –

関連する問題