Okhttp上传文件的进度获取

下载进度的在之前的文章中实现过:
Android的Splash启动图的两种动态切换方式

根据服务器的数据声明上传文件的方法

    @Multipart
    @POST("upload")
    Observable<UploadImgBean> uploadHeadPic(@Part MultipartBody.Part files);

借助okhttp的RequestBody我们构造一个FileRequestBody继承RequestBody

public class FileRequestBody extends RequestBody {
    private RequestBody mRequestBody;
    private LoadingListener mLoadingListener;
    private long mContentLength;

    public FileRequestBody(RequestBody requestBody, LoadingListener loadingListener) {
        mRequestBody = requestBody;
        mLoadingListener = loadingListener;
    }

    //文件的总长度
    @Override
    public long contentLength() {
        try {
            if (mContentLength == 0)
                mContentLength = mRequestBody.contentLength();
            return mContentLength;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return -1;
    }

    @Override
    public MediaType contentType() {
        return mRequestBody.contentType();
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        ByteSink byteSink = new ByteSink(sink);
        BufferedSink mBufferedSink = Okio.buffer(byteSink);
        mRequestBody.writeTo(mBufferedSink);
        mBufferedSink.flush();
    }


    private final class ByteSink extends ForwardingSink {
        //已经上传的长度
        private long mByteLength = 0L;

        ByteSink(Sink delegate) {
            super(delegate);
        }

        @Override
        public void write(Buffer source, long byteCount) throws IOException {
            super.write(source, byteCount);
            mByteLength += byteCount;
            mLoadingListener.onProgress(mByteLength, contentLength());
        }
    }

    public interface LoadingListener {
        void onProgress(long currentLength, long contentLength);
    }
}

实现上传

RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-data"), file);
        FileRequestBody fileRequestBody = new FileRequestBody(requestFile, new FileRequestBody.LoadingListener() {
            @Override
            public void onProgress(long currentLength, long contentLength) {
                //获取上传的比例
                Log.d("Tag---", currentLength + "/" + contentLength);
            }
        });
        //files是与服务器对应的key
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("files", file.getName(), fileRequestBody);
        RetrofitHelper.userApi().uploadHeadPic(body).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<UploadImgBean>() {
                    @Override
                    public void call(UploadImgBean uploadImgBean) {
                        //上传成功
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                       //上传失败
                    }
                });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,404评论 25 708
  • 引言 在 Android 开发中,类加载机制是理解应用运行原理的核心知识点。无论是插件化、热修复还是动态化技术,都...
    野火友烧不尽阅读 5,881评论 8 18
  • 这两天连续看了两篇有关村上春树的文章,一篇是写如何成为小说家,一篇写了他的人生,在此之前,只知道村上是个很出名的作...
    hyuk_tt阅读 196评论 0 0
  • 不要把爱变成伤害 爱情是永远的主题,行行色色的人,行行色色的爱情,人们常说爱情是自私的,的确有道理。可是...
    遇见美好ZJF阅读 342评论 2 2
  • 2017/3/24 晚 下班回家的路上突然下雨,还好我带伞了,走着走着看到前面一个阿姨拿衣服挡着头往前走,衣服已经...
    薛之谦污哇阅读 116评论 0 0