zoukankan      html  css  js  c++  java
  • Okhttp3上传多张图片同时传递参数

    之前上传图片都是直接将图片转化为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

    在UI界面的调用:

    OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.newThread())
                    .subscribe(new Subscriber<String>() {
                        @Override
                        public void onCompleted() {
    
                        }
    
                        @Override
                        public void onError(Throwable throwable) {
                            LogUtil.i(TAG, "throwable:" + throwable.toString());
                        }
    
                        @Override
                        public void onNext(String s) {
                           
                            LogUtil.i(TAG, "s:" + s);
                        }
                    });
    View Code

    调试过程中,有一次将

    multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
    写成了
    multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));
    导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。


    最后:非常感谢同事的帮助!赠人玫瑰,手有余香~
  • 相关阅读:
    2019年主机游戏将走下坡路
    关于敏捷开发的26个心得
    CSS3弹性布局内容对齐(justify-content)属性使用具体解释
    (cLion、RubyMine、PyCharm、WebStorm、PhpStorm、Appcode、Clion、Idea) 万能破解,获取自己的注冊码
    hdoj-1212-Big Number【大数取余&amp;简单题】
    gitlab https
    gitlab smtp设置
    GitLab: API is not accessibl
    Could not find modernizr-2.6.2 in any of the sources GitLab: API is not accessible
    gitlab
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/6407271.html
Copyright © 2011-2022 走看看