Retrofit上传单图、多图、图文

上传单图

以上传头像为例

@Multipart
@POST(URLConstants.uploadAvatar)
Call<ResponseBody> uploadAvatar(@Part MultipartBody.Part imgs);
private void uploadAvatar(String path) {
        File file = new File(path);
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
        RetrofitUtils.getService().uploadAvatar(part).enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    
                } else {
                    
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                
            }
        });
    }

多图和文字参数一起上传

以意见反馈页面为例

@Multipart
@POST(URLConstants.feedBack)
Call<ResponseBody> feedBack(@Part("Content") String Content,@Part("ContactInformation")String conInfo,
                                @Part() List<MultipartBody.Part> parts);

content --反馈的内容
conInfo--联系方式
具体参数由实际来定
List<MultipartBody.Part> parts--图片列表

List<MultipartBody.Part> parts = new ArrayList<>();
                for (int i = 0; i < selImageList.size(); i++) {
                    //这里采用的Compressor图片压缩
                    File file = new Compressor.Builder(FeedBackActivity.this)
                            .setMaxWidth(720)
                            .setMaxHeight(1080)
                            .setQuality(80)
                            .setCompressFormat(Bitmap.CompressFormat.JPEG)
                            .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
                                    Environment.DIRECTORY_PICTURES).getAbsolutePath())
                            .build()
                            .compressToFile(new File(selImageList.get(i).path));
                    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
                    MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
                    parts.add(part);
                }
                RetrofitUtils.getService().feedBack(etFeedBack.getText().toString(),etContact.getText().toString(),parts).enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        if (response.isSuccessful()) {
                           
                        } else {
                            
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {
                        
                    }
                });

以下是上传图文的一个坑

@Multipart
@POST(URLConstants.feedBack)
Call<ResponseBody> feedBack(@Part("Content") String Content,@Part("ContactInformation")String conInfo,
                                @Part() List<MultipartBody.Part> parts);

如上,Content 和 conInfo 以String上传的话,服务端接收到的参数会带双引号

解决办法:用RequestBody上传

@Multipart
@POST(URLConstants.feedBack)
Call<ResponseBody> feedBack(@Part("Content") RequestBody Content,@Part("ContactInformation")RequestBody conInfo,
                                @Part() List<MultipartBody.Part> parts);

String转RequestBody方法:

public RequestBody toRequestBody(String value) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), value);
        return requestBody;
    }

参考链接

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 70,966评论 12 116
  • 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,现在已...
    Android开发__落岑阅读 216评论 0 2
  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful2、Retrofit解析2...
    隔壁老李头阅读 4,653评论 4 25
  • # 一度蜜v3.0协议 --- # 交互协议 [TOC] ## 协议说明 ### 请求参数 下表列出了v3.0版协...
    c5e350bc5b40阅读 102评论 0 0
  • 前言 Retrofit 是 square 公司开源的一个非常著名的简化网络请求的框架,但是它不是网络框架,OkHt...
    DanieX阅读 308评论 0 0