OkHttp 上传文件, 支持单个, 多个文件上传

OkHttp 上传文件, 支持单个, 多个文件上传

// okhttp3 的版本信息如下
    // implementation com.squareup.okhttp3:okhttp:3.6.0
    // implementation com.squareup.okhttp3:okhttp-urlconnection:3.6.0



    /**
     * 上传文件(支持单个, 多个文件上传)
     */
    public void upLoadingFile(String userId,
                              String businessId,
                              String type,
                              String meetInfoId,
                              String filePath) {
          
   

        mLog.d("url   ------>>  " + mRequestUrl);

        // 1.RequestBody
        //创建MultipartBody.Builder,用于添加请求的数据
        MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
        File file = new File(filePath); //生成文件
        // 根据文件的后缀名,获得文件类型
        String fileType = getMimeType(file.getName());
        //给Builder添加上传的文件
        multipartBodyBuilder.addFormDataPart(
                "image",  //请求的名字
                file.getName(), //文件的文字,服务器端用来解析的
                RequestBody.create(MediaType.parse(fileType), file) //创建RequestBody,把上传的文件放入
        );

		// 添加其他参数信息, 如果只是单纯的上传文件, 下面的添加其他参数的方法不用调用
        multipartBodyBuilder.addFormDataPart("userId", userId);
        multipartBodyBuilder.addFormDataPart("businessId", businessId);
        multipartBodyBuilder.addFormDataPart("type", type);
        multipartBodyBuilder.addFormDataPart("meetInfoId", meetInfoId);

        RequestBody requestBody = multipartBodyBuilder.build();//根据Builder创建请求

        mLog.d("params   ------>>  " + multipartBodyBuilder.toString());
        mLog.d("params   ------>>  " + requestBody.toString());

        // 2.requestBuilder
        Request.Builder requestBuilder = new Request.Builder();
        requestBuilder.url(mRequestUrl).post(requestBody);
        Request requestBuilderRequest = requestBuilder.build();
        
        
        // 3.OkHttpClient
        OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
                .sslSocketFactory(createSSLSocketFactory())//创建一个证书对象
                .hostnameVerifier(new TrustAllHostnameVerifier())//校验名称,这个对象就是信任所有的主机,也就是信任所有https的请求
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .build();

        Call call = mOkHttpClient.newCall(requestBuilderRequest);

        call.enqueue(new Callback() {
          
   
            @Override
            public void onFailure(Call call, IOException e) {
          
   
                //请求失败监听: 异步请求(非主线程)
                mLog.d("error   ------>>  " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) {
          
   
                mLog.d("onResponse   ------>>  ");
            }
        });

    }

    /**
     * 获取文件MimeType
     *
     * @param filename
     * @return
     */
    private static String getMimeType(String fileName) {
          
   
        FileNameMap filenameMap = URLConnection.getFileNameMap();
        String contentType = filenameMap.getContentTypeFor(fileName);
        if (contentType == null) {
          
   
            contentType = "application/octet-stream"; //* exe,所有的可执行程序
        }
        return contentType;
    }
经验分享 程序员 微信小程序 职场和发展