美文网首页
OkHttp3/Retrofit上传单个文件

OkHttp3/Retrofit上传单个文件

作者: 王魔王 | 来源:发表于2019-11-14 17:18 被阅读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卡权限
    三、别的未知原因😂

    相关文章

      网友评论

          本文标题:OkHttp3/Retrofit上传单个文件

          本文链接:https://www.haomeiwen.com/subject/mqnrictx.html