Retrofit 实现图片文字一起上传

在上传图片的过程中 我们经常上传一张图片的同时还要上传 其他一些附加信息 这里我是使用Retrofit 进行图片上传的  这里我就 已经认为你会Retrofit的基本使用了

现在上关键代码 

1.

MultipartBody.Builder form = new MultipartBody.Builder();

form.setType(MultipartBody.FORM);
//设置表单字段
form.addFormDataPart("width", width);
form.addFormDataPart("height", height);
//设置图片信息
File file = new File("图片地址");

RequestBody fileBody = RequestBody.create(MediaType.parse("image/*"), file);
form.addFormDataPart( "upfile", file.getName(), fileBody); Builder 是MultipartBody中的一个内部类 其实就是建造者模式  利用这个建造者 设置 MIME  类型, 这里是表单形式,接下来 就是设置 文字 信息 ,最重要的就是RequestBody的出创建,里面包含了 请求信息 。

填写好要上传的字段之后 创建MultipartBody  partBody = form.build();

那Retrofit如何使用这个 partBody 呢


/*
 * 发表图片上传
 * @param file
 * @return
 */
@POST("api/image/upload")
Call uploadPublishImage(@Body MultipartBody data);
如果你使用过Retrofit的话 看到 这点 应该就不会再问啥了


2.

上面这中方式比较优雅  下面还有另一种  图片 上传方式  

RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), new File(“文件路径"));
同样也是 创建一个RequestBody  那如何使用呢  看请求代码


@Multipart
@POST("api/image/upload")
Call uploadImage(@Part("upfile\"; filename=\"image.jpg\"") RequestBody file,@Part("width") int width, @Path("height")int height);

下面的这段代码看着比较乱 明显没有第一种看着 优雅

3.还有一种情况 就是我们有时候可能 一个接口要一次上传好多字段,结果我们一个请求接口里面总是写好多的参数,看起来乱乱的,一个不小心就要写错位置
那如何比较清晰一点呢,很简单 就是利用Map,  Map的数据结构 就是键值对, key就是你要上传的参数名称,value就是你要上传的值

Map data = new HashMap<>();
data.put("type", type);
data.put("reason", reason);
data.put("other_id",id);
这个 map你可以无限写参数 对应也很明确,再也不用一个请求接口写好多参数,老长老长了。
那如何请求呢

/* 举报接口
 * @return
 */
@FormUrlEncoded
@POST("api/report/create")
Call reportSomeBody(@FieldMap Map data);

就是用到了 这几几个注解  千万不要写错了 一个不可以少  有了这几个 以后就可以优雅的写很多参数了,上面的这个是post请求,那就有人要问了,那get请求如果也是很多参数那怎么办
当然 有@FieldMap这个注解 就会有@QueryMap这个注解 对应于Get请求,其他的 请自行补脑。



你可能感兴趣的:(安卓问题篇)