Retrofit上传单个文件

今天心血来潮,写个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.csdn.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();
        }
    });
}

猜你喜欢

转载自blog.csdn.net/weixin_40430041/article/details/79023078