今天心血来潮,写个retrofit上传单个图片的小demo,小练习,以作为项目介绍的纪念!
老规矩,先展示效果:

retrofit的上传难点就在于post路径的拼接,也就是APiServers接口的注解:
我这边也已经为小伙伴们准备好啦!
package bw.com.rikao0110.APiServer;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Url;
/**
* Created by mypc on 2018/1/10.
*/
public interface APIServers {
//封装retrofit+Rxjava的注解GET
@GET
Observable<String> getAPIServers(@Url String url);
//用来上传文件的注解POST请求
@Multipart
@POST("file/upload?uid=3470&source=android")
Call<ResponseBody> upload(@Part("description") RequestBody description,
@Part MultipartBody.Part file);
}
注解接口问题解决了,剩下的就是逻辑上的操作了!来,继续看代码:
/**
* 上传文件的方法,,上传成功后,重新请求用户接口,从新为头像等赋值
代吗来源于:http://blog.****.net/zhangxing52077/article/details/52830045,,只需更改接口和接口的参数
京东上传图片的接口:https://www.zhaoapi.cn/file/upload?uid=3470&file="+file+"&source=android
* @param file
*/
private void postFile(File file) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.zhaoapi.cn/")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIServers apiServers = retrofit.create(APIServers.class);
RequestBody requestFile =
RequestBody.create(MediaType.parse("application/otcet-stream"), file);
//这是个重点,,参数1:上传文件的key,,参数2:上传的文件名,,,参数3,请求头
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", file.getName(), requestFile);
String descriptionString = "This is a description";
RequestBody description =
RequestBody.create(
MediaType.parse("multipart/form-data"), descriptionString);
Call<ResponseBody> call = apiServers.upload(description, body);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call,
Response<ResponseBody> response) {
Log.i("jiba","这是成功的===="+response.body().toString());
getUser();//上传成功后,需要重新访问接口,用来展示新的数据
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
}
private void getUser() {
String uid = sp.getString("uid", "");
String ren = APIuil.getRen(uid);
myPresenter.getPreContent(ren, new JieKouHuiDiao() {
@Override
public void chenggong(String json) {
Gson gson = new Gson();
MyUserBean myUserBean = gson.fromJson(json, MyUserBean.class);
edit.putString("icon", (String) myUserBean.getData().getIcon()).commit();
if(myUserBean.getData().getIcon().equals("null")){
shezhiTouXiang.setImageResource(R.mipmap.ic_launcher);
}else{
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(Uri.parse((String) myUserBean.getData().getIcon()))//uri图片路径
.build();
shezhiTouXiang.setController(controller);
}
shezhiname.setText(myUserBean.getData().getUsername());
shezhitoken.setText(myUserBean.getData().getToken());
}
@Override
public void shibai(String ss) {
Toast.makeText(Main3Activity.this,ss,Toast.LENGTH_SHORT).show();
}
});
}