Retrofit+RxJava之(上传文件)

单个文件上传 @Multipart @Part

*Retrofit接口

@Multipart
@POST("file/upload") //参数比较多但最主要的就是标红的地方
Observable uploadImage(@Query("source") String source , @Query("appVersion") String appVersion , @Query("uid") String uid, @Part MultipartBody.Part file, @Query("token") String token);
把所有代码先贴上然后再解释

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main5);
    creat = new RetrofitManager("https://www.zhaoapi.cn").creat(Api.class);
    new Thread(new Runnable() {
        @Override
        public void run() {
            Uri externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            String[] projImage = {MediaStore.Images.Media._ID
                    , MediaStore.Images.Media.DATA
                    , MediaStore.Images.Media.SIZE
                    , MediaStore.Images.Media.DISPLAY_NAME};
            Cursor mCursor = getContentResolver().query(externalContentUri,
                    projImage,
                    MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
                    new String[]{"image/jpeg", "image/png"},
                    MediaStore.Images.Media.DATE_MODIFIED + " desc");

            if (mCursor != null) {
                while (mCursor.moveToNext()) {
                    // 获取图片的路径
                    String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    int size = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Images.Media.SIZE)) / 1024;
                    String displayName = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                    // 获取该图片的父路径名
                    String dirPath = new File(path).getParentFile().getAbsolutePath();
                    list.add(path);
                    //存储对应关系
                    Log.e("TAG", "path:" + path + "size:" + size + "displayName" + displayName + "" + "");
                }
                mCursor.close();
            }

            if(list!=null){
                String s = list.get(0);
                Log.e("TAG111",s);
                File file = new File(s);
                final RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
                MultipartBody.Part body =
                        MultipartBody.Part.createFormData("file", file.getName(), requestFile);
                Observable android = creat.uploadImage("android", "101", "2902", body, MyApp.token);
                 android.subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(TouXiangBean responseBody) throws Exception {
                        Log.e("TAG111",responseBody.getMsg());
                    }
                });

            }
        }
    }).start();
}
首先开始获取本地所有图片的地址等信息

new Thread(new Runnable() {
    @Override
    public void run() {
        Uri externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projImage = {MediaStore.Images.Media._ID
                , MediaStore.Images.Media.DATA
                , MediaStore.Images.Media.SIZE
                , MediaStore.Images.Media.DISPLAY_NAME};
        Cursor mCursor = getContentResolver().query(externalContentUri,
                projImage,
                MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
                new String[]{"image/jpeg", "image/png"},
                MediaStore.Images.Media.DATE_MODIFIED + " desc");

        if (mCursor != null) {
            while (mCursor.moveToNext()) {
                // 获取图片的路径
                String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                int size = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Images.Media.SIZE)) / 1024;
                String displayName = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                // 获取该图片的父路径名
                String dirPath = new File(path).getParentFile().getAbsolutePath();
            }
            mCursor.close();
        }
    }
}).start();
获取到本地地址之后将所有地址放在集合,这是一个简单的demo所以并没有使用mvp框架直接用Rxjava+ Retrofit请求网络了,先拿到file对象也就是Body

 
  
String s = list.get(0);
File file = new File(s);
final RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
现在使用RxJava得到数据

 
  
creat = new RetrofitManager("https://www.zhaoapi.cn").creat(Api.class);
creat.uploadImage("android", "101", "2902", body, MyApp.token).subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
    @Override
    public void accept(TouXiangBean responseBody) throws Exception {
        Log.e("TAG111",responseBody.getMsg());
    }
});

好了,到这里就完成了,看看自己打的Log是否成功



你可能感兴趣的:(Retrofit+RxJava之(上传文件))