在Android中跟踪FTP上传数据?

时间:2012-01-06 05:48:21

标签: java android ftp

我有一个使用android的FTP系统,但我希望能够在上传时跟踪字节,这样我就可以在上传过程中更新进度条。这可能与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<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);
        }
    }
}

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

这可以使用Secure FTP Factory库完成。

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

JavaDoc:Overview (secure FTP Factory API)

下载:Java FTP, Java FTPS and Java SFTP Components