之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。

最近做项目,打算换个方法上传图片。

Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片。

Okhttp目前已经更新到Okhttp3版本了,用法跟之前相比,也有一些差别。在网上找了很多资料,

并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数。

以下是我对该过程的封装:

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

/**
     * 上传多张图片及参数
     * @param reqUrl URL地址
     * @param params 参数
     * @param pic_key 上传图片的关键字
     * @param paths  图片路径
     */
    public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){
        return Observable.create(new Observable.OnSubscribe<String>(){

            @Override
            public void call(Subscriber<? super String> subscriber) {
                MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
                multipartBodyBuilder.setType(MultipartBody.FORM);
                //遍历map中所有参数到builder
                if (params != null){
                    for (String key : params.keySet()) {
                        multipartBodyBuilder.addFormDataPart(key, params.get(key));
                    }
                }
                //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
                if (files != null){
                    for (File file : files) {
                        multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
                    }
                }
                //构建请求体
                RequestBody requestBody = multipartBodyBuilder.build();

                Request.Builder RequestBuilder = new Request.Builder();
                RequestBuilder.url(reqUrl);// 添加URL地址
                RequestBuilder.post(requestBody);
                Request request = RequestBuilder.build();
                mOkHttpClient.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        subscriber.onError(e);
                        subscriber.onCompleted();
                        call.cancel();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String str = response.body().string();
                        subscriber.onNext(str);
                        subscriber.onCompleted();
                        call.cancel();
                    }
                });
            }
        });
    }
View Code

相关文章:

  • 2021-11-17
  • 2022-01-16
  • 2022-01-02
  • 2022-01-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-23
  • 2021-11-07
  • 2022-12-23
  • 2021-11-16
  • 2021-05-16
  • 2021-08-05
相关资源
相似解决方案