• 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));
    导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。


    最后:非常感谢同事的帮助!赠人玫瑰,手有余香~
  • 相关阅读:
    VC(VISUAL_C++)虚拟键VK值列表
    关于新一轮QQ Tencent://Message 在线联系
    (记录) sql exists 应用及 order by注意点
    (记录)IE8 ..样式错乱解决
    jquery 关于ajax 中文字符长度过长后不执行
    DataList 嵌套绑定CheckBoxList [记录, 以免忘记哈.]
    (记录)MSSQL 的一些应用 查询数据统计适用 添加月份日号作为行记录
    数据结构回顾算法
    Modeling Our World笔记
    数据结构2数组
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/6407271.html
Copyright © 2020-2023  润新知