美文网首页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