【问题标题】:Track FTP upload data in android?在android中跟踪FTP上传数据?
【发布时间】:2012-01-06 05:48:21
【问题描述】:

我有一个使用 android 的 FTP 系统,但我希望能够在上传字节时跟踪它们,所以我可以在上传过程中更新进度条。安卓可以吗?现在,我正在使用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);
        }
    }
}

我想知道我是否可以运行一个进度条,每隔几个上传的字节更新一次? 干杯

【问题讨论】:

  • 同样的问题我无法在上传时显示进度条,因为FTPClient 没有让我获得完整上传+1的状态
  • 没错,FTPClient 只会在每次上传后返回信息,但是当您上传单个文件时,就会出现问题。
  • 检查我的答案here 它的工作。

标签: java android ftp


【解决方案1】:

This question 有一个 InputStream 的实现,其中包括一个进度回调。在文件上传期间使用该 InputStream 并从该回调调用 publishProgress 进行增量更新。

【讨论】:

    【解决方案2】:

    下载这个 .jar 文件

    httpmime-4.1.1.jar 和 commons-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();
    
            }
    

    //进度输入流

    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);
        }
    }
    

    【讨论】:

    • 我用过这个,当涉及到count 变量时,它只返回-1 任何理论为什么?
    • @BlackWraith 我认为你的输入流可能为空,请先检查一下。
    【解决方案3】:

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

    你只需要实现一个com.jscape.inet.ftp.FtpListener接口的实例,将该实例注册到Ftp类并重载progress(FtpProgressEvent事件)方法来获取进度信息。

    JavaDoc:Overview (secure FTP Factory API)

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

    【讨论】:

    • 这听起来很有希望,但是我可以使用任何免费版本吗?我不想花 600 美元在单个应用程序中使用一次。
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多