请问这样子上传文件,该怎样拿到这个文件的上传进度并转成百分比呢?

 /**
     * 上传视频
     */
    private void uploadVideo() {
        String title = mTitle.getText().toString().trim();
        if (TextUtils.isEmpty(title)) {
            ToastUtil.showMessage(R.string.title_cannot_empty);
            return;
        }
        HashMap<String, String> map = new HashMap<>();
        File file = new File(url);
//        RequestBody requestBody = RequestBody.create(MediaType.parse("video/*"), file);
        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
        String uid = UserManager.getInstance().getUid();
        map.put("type", "user");
        map.put("dataType", "1");
        map.put("videoType", "video");
        map.put("dataName", title);
        map.put("userId", uid);
        RxManager.getMethod().uploadVideo(body, map)
                .compose(RxUtil.schedulers(this))
                .subscribe(new RxCallback<UploadVideoBean>(this) {

                    @Override
                    public void onStart() {
                        setShowProgress(false);
                        super.onStart();
                    }

                    @Override
                    public void onSubscribe(Disposable d) {
                        if (mKProgressHUD == null) {
                            mKProgressHUD = KProgressHUD.create(PreviewActivity.this)
                                    .setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
                                    .setAnimationSpeed(2)
                                    .setDimAmount(0.5f)
                                    //TODO: 可改为百分比显示上传进度
                                    .setLabel("视频上传中,请稍等...")
                                    .setCancellable(false);
                        }
                        mKProgressHUD.show();
                    }

                    @Override
                    public void onSuccess(UploadVideoBean uploadVideoBean, String msg) {
                        ToastUtil.showMessage(R.string.upload_success_please_wait_audit);
                        MainActivity.open(PreviewActivity.this);
                        finish();
                    }

                    @Override
                    public void onFinish(boolean hasError) {
                        if (mKProgressHUD != null) {
                            mKProgressHUD.dismiss();
                        }
                    }
                });
    }
阅读 2k
1 个回答

重写RequestBody;
public class UploadFileRequestBody extends RequestBody {

private RequestBody mRequestBody;
private Handler mProgressHandler;
private BufferedSink bufferedSink;

public UploadFileRequestBody(@NonNull File file, @NonNull Handler progressHandler) {
    this.mRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    this.mProgressHandler = progressHandler;
}

public UploadFileRequestBody(@NonNull RequestBody requestBody, @NonNull Handler progressHandler) {
    this.mRequestBody = requestBody;
    this.mProgressHandler = progressHandler;
}

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

//返回了本RequestBody的长度,也就是上传的totalLength
@Override
public long contentLength() throws IOException {
    return mRequestBody.contentLength();
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
    if (bufferedSink == null) {
        //包装
        bufferedSink = Okio.buffer(sink(sink));
    }
    //写入
    mRequestBody.writeTo(bufferedSink);
    //必须调用flush,否则最后一部分数据可能不会被写入
    bufferedSink.flush();
}

private Sink sink(Sink sink) {
    return new ForwardingSink(sink) {
        //当前写入字节数
        long bytesWritten = 0L;
        //总字节长度,避免多次调用contentLength()方法
        long contentLength = 0L;

        @Override
        public void write(Buffer source, long byteCount) throws IOException {
            super.write(source, byteCount);
            if (contentLength == 0) {
                //获得contentLength的值,后续不再调用
                contentLength = contentLength();
            }
            //增加当前写入的字节数
            bytesWritten += byteCount;
            //刷新上传进度条
            updateProgress(bytesWritten, contentLength, bytesWritten == contentLength);
        }
    };
}

/** 更新上传进度条 */
private void updateProgress(long hasWrittenLen, long totalLen, boolean hasFinish) {
//计算百分比
    int percent = (int) (hasWrittenLen * 100 / totalLen);
    if(hasFinish){
        percent = 100;
    }
    Message msg = Message.obtain();
    msg.what = 35;
    msg.arg1 = percent;
    mProgressHandler.sendMessage(msg);
}

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题