美文网首页retrofit+rxjava
Retrofit多图上传

Retrofit多图上传

作者: 叶寒_Alex | 来源:发表于2019-07-30 17:21 被阅读0次

首先是定义接口部分:

public interface MyApi{
    @Multipart
    @POST("renovation/uploadImg")
    Observable<HttpResult> upLoadsImg(@PartMap Map<String, RequestBody> params,  @Part("content")RequestBody content);
}

注意 这里使用@Multipart注解,参数这里使用@PartMap@Part,他们是用来上传文件用的。 这里需要注意的是,使用了@Multipart注解,参数的类型都应该是RequestBody,不然上传的图片的时候会报JSON must start with an array or an object错误。上传多张图片就使用@PartMap Map<String, RequestBody>

public interface MyApi{
   @Multipart
   @POST("renovation/uploadSingleImg")
   Observable<HttpResult> upLoadsImg(@Part MultipartBody.Part photo);
}

单图上传就用 @Part MultipartBody.Part

其次就是具体实现部分(以多图上传为例):

Observer<HttpResult> observer = new Observer<HttpResult>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            progressUtils.dismiss();
            e.printStackTrace();
        }

        @Override
        public void onNext(HttpResult httpResult) {
            //处理返回结果
            if (httpResult.isStatus()) {
                Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(mContext, "上传失败", Toast.LENGTH_SHORT).show();
            }
            progressUtils.dismiss();
        }
    };


private void submitData() {

        //图片压缩
        compressUtils();

        Map<String, RequestBody>  photos = new HashMap<>();
        //mPhotoList是选择图片后的返回路径
        if (mPhotoList.size() > 0) {
            for (int i = 0; i < mPhotoList.size(); i++) {
                File  file = new File(mPhotoList.get(i).getPhotoPath());
                RequestBody  requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
             //   RequestBody  requestFile = RequestBody.create(MediaType.parse("image/jpg"), file);

                //这里前面一部分是服务器要求你传的key,加上一个i,就可以动态设置key的长度
                photos.put("AttachmentKey"+i+"\"; filename=\""+file.getName(),requestFile);
            }
        }

        subscription  = Network.getMyApi().upLoadsImg(photos,RequestBody.create(null,content))
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);

    }

这里详细解释已经在代码中有注释说明,我按照这个方法上传是没有问题的。相册选机器我推荐使用 GalleryFinal里面的功能很详细,实现了拍照、图片选择(单选/多选)、 裁剪(单/多裁剪)、旋转等功能,具体链接里面有介绍。

原文地址

相关文章

网友评论

    本文标题:Retrofit多图上传

    本文链接:https://www.haomeiwen.com/subject/aronrctx.html