OkHttp3/Retrofit上传单个文件

2019-11-14  本文已影响0人  王魔王

OkHttp也好,Retrofit也罢,上传文件的本质都是要把上传的文件放入Http协议的请求体中,只不过不同的网络框架有不同的写法而已

接下来以本公司的接口示例讲解怎么使用OkHttp上传单文件


接口文档

上传文件的所谓的难点在于对于请求体的构建,那么OkHttp构建文件表单请求体的模板代码如下:

      //filePath为文件的绝对路径,这里注意权限问题
       File file = new File(filePath);
        if (!file.exists()) {
            log.d("找不到该文件");
            return;
        }
        RequestBody requestBody= null;
        //声明请求体的类型为文件表单类型
        MediaType mediaType = MediaType.parse("multipart/form-data");
        //通过静态方法创建请求体
        //file为要上传的文件,mediaType为上一步中 声明的请求体类型
        requestBody = RequestBody.create(file, mediaType);
         //创建文件表单的请求体,把文件请求体、文本参数放入表单中
        MultipartBody multipartBody = new MultipartBody.Builder()
                 .addFormDataPart("file",file.getName(),requestBody)
                  .addFormDataPart("content","这个是描述内容")
                 .build();
        Request request = new Request.Builder().url("http://xxxxxxxxxx")
                .post(multipartBody)//post方式提交表单
                .build();

         //创建请求任务
        Call call = OkhttpManager.getInstance().getOkHttpClient().newCall(request);
        //执行异步请求任务
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {

          
            }
        });

接下来是使用Retrofit上传单个文件

由于Retrofit只是对网络请求做了一次包装,所以Retrofit的上传单个文件的方式跟OkHttp几乎一模一样
1、接口定义


 @POST("http://xxxxxxx")
 @Multipart
Observable<UpHeadReseponse> upHead(@Part("image") MultipartBody multipartBody,@Part("content") String content);

参数解释:
@POST:post方式请求
@Multipart:文件表单提交
@Part("image") MultipartBody body:形参为 image,实参为MultipartBody,这个MultipartBody是OkHttp的(有没有觉得很奇怪)
@Part("content")形参为content,实参为String,这个参数是接口文档中要求的另外一个参数
使用方式如下

 //filePath为文件的绝对路径,这里注意权限问题
       File file = new File(filePath);
        if (!file.exists()) {
            log.d("找不到该文件");
            return;
        }
        RequestBody requestBody= null;
        //声明请求体的类型为文件表单类型
        MediaType mediaType = MediaType.parse("multipart/form-data");
        //通过静态方法创建请求体
        //file为要上传的文件,mediaType为上一步中 声明的请求体类型
        requestBody = RequestBody.create(file, mediaType);
         //创建文件表单的请求体,把文件请求体、文本参数放入表单中
        MultipartBody multipartBody = new MultipartBody.Builder()
                 .addFormDataPart("file",file.getName(),requestBody)
                  .addFormDataPart("content","这个是描述内容")
                 .build();
 //通过工具类初始化Retrofit
        Retrofit retrofit = RetrofitUtil.getInstance().getRetrofit();
        //创建接口的实例
        ApiService apiService = retrofit.create(ApiService.class);
        //调用方法
        Observable<UpHeadReseponse> observable = apiService.upHead(multipartBody,"这个是描述");
        // TODO: 2019/11/15 接下来就是使用observable发起请求了 ,如果你不会,我建议你出门左转先看看retrofit怎么使用

**注释写的已经够详细的了,这段模板代码足以支撑上传单个文件**
现在再回过头来看本文中开头的那一句话:OkHttp也好,Retrofit也罢,上传文件的本质都是要把上传的文件放入Http协议的请求体中,只不过不同的网络框架有不同的写法而已
OkHttp与Retrfofit上传单个文件的重点都在于对于请求体的构建,而这两个框架使用了相同的请求体即:MultipartBody,所以重点就集中到了MultipartBody的构建上。
PS:如果在调试过程中发生异常,那么仔细检查:
一、是不是文件过大,超时了
二、是不是没有Sd卡权限
三、别的未知原因😂

上一篇 下一篇

猜你喜欢

热点阅读