Retrofit+RxJava之(上传文件)

本文介绍如何使用Retrofit和RxJava实现Android应用中的图片上传功能。通过具体代码示例展示了如何从Android设备中选择图片并将其上传到服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单个文件上传 @Multipart @Part

*Retrofit接口

@Multipart
@POST("file/upload") //参数比较多但最主要的就是标红的地方
Observable<TouXiangBean> 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<TouXiangBean> android = creat.uploadImage("android", "101", "2902", body, MyApp.token);
                 android.subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<TouXiangBean>() {
                    @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<TouXiangBean>() {
    @Override
    public void accept(TouXiangBean responseBody) throws Exception {
        Log.e("TAG111",responseBody.getMsg());
    }
});

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值